クラスBがstd :: vectorから派生しているかどうかをコンパイル時にテストする方法は?クラスBがクラスのテンプレートファミリから派生しているかどうかをテストする方法
template<class A>
struct is_derived_from_vector {
static const bool value = ????;
};
クラスBがテンプレートファミリから派生しているかどうかをコンパイル時にテストするにはどうすればよいですか?
template<class A, template<class> class Family>
struct is_derived_from_template {
static const bool value = ????;
};
使用:
template<class T> struct X {};
struct A : X<int> {}
struct B : std::vector<char> {}
struct D : X<D> {}
int main() {
std::cout << is_derived_from_template<A, X>::value << std::endl; // true
std::cout << is_derived_from_template<D, X>::value << std::endl; // true
std::cout << is_derived_from_vector<A>::value << std::endl; // false
std::cout << is_derived_from_vector<B>::value << std::endl; // true
}
(私はC++ 11がここに助けることができることを確認していないが)、それはあなたが唯一のC++ 03やC++ 11のソリューションを必要とするかどうか、それが明示的にすることが重要であることは良いです。そして、スマートな発言として、標準コンテナから継承するべきではないということを考えると、元の特性は単純です: 'false':P –
C++ 03。私はmsvc 2010コンパイラを使用します。したがって、私は 'decltype'を使うことに同意します。 'std :: vector'は例えばonyです。 C++ 03のソリューションがわからない場合は、C++ 11のソリューションも歓迎します。 –