現在、テンプレートのメタプログラミングを行っています。私の場合、「反復可能な」型、つまり atypedef foo const_iterator
が同じ方法で存在する型を処理できます。これに新しい C++11 テンプレート メタプログラミングを使用しようとしましたが、特定の型が欠落しているかどうかを検出する方法が見つかりませんでした。
他の特性に基づいて他のテンプレートの特殊化もオン/オフにする必要があるため、現在 2 つのパラメーターを持つテンプレートを使用しており、2 つ目のパラメーターはstd::enable_if
. これが私が現在行っていることです:
template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid
template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{
void do_stuff(){ ... }
};
template<typename T>
struct exists{
static const bool value = true;
};
template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
void do_stuff(){ ... }
};
exists
ヘルパー テンプレートがないと、このようなことはできませんでした。たとえば、単純に
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
この特殊化を使用する必要がある場合に、無効なデフォルトのケースが代わりにインスタンス化されたため、機能しませんでした。
ただしexists
、新しい C++11 標準のどこにもこれを見つけることができませんでしboost::type_traits
た。ただし、ホームページでboost::type_traits
は、代わりに使用できるものへの参照は表示されません。
この機能が欠けているのでしょうか、それとも、目的の動作を達成するための他の明白な方法を見落としていましたか?