Come testare in fase di compilazione se la classe B è derivata da std :: vector?Come verificare se la classe B è derivata dalla famiglia di classi di template
template<class A>
struct is_derived_from_vector {
static const bool value = ????;
};
Come verificare in fase di compilazione se la classe B è derivata dalla famiglia di modelli?
template<class A, template<class> class Family>
struct is_derived_from_template {
static const bool value = ????;
};
Usando:
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
}
Con modello metaprogrammazione, è importante per rendere più esplicita se avete bisogno di un C++ 03 solo o con una soluzione C++ 11 è buono (anche se non sono sicuro che il C++ 11 può aiutare qui) . E come osservazione intelligente, dato che non si dovrebbe mai ereditare da contenitori standard il tratto originale è semplice: 'false': P –
C++ 03. Io uso il compilatore msvc 2010. Pertanto accetto di usare 'decltype' in aggiunta. 'std :: vector' è per esempio ony. Se non conosci la soluzione C++ 03, allora anche la soluzione C++ 11 è la benvenuta. –