¿Cómo comprobar en tiempo de compilación si la clase B se deriva de std :: vector?Cómo comprobar si la clase B se deriva de la familia de clases de plantilla
template<class A>
struct is_derived_from_vector {
static const bool value = ????;
};
Cómo comprobar en tiempo de compilación si la clase B se deriva de la familia de plantillas?
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 metaprogramming plantilla, es importante hacer explícito si se necesita un C++ solamente 03 o una solución de C++ 11 es buena (aunque no estoy seguro de que C++ 11 puede ayudar aquí) . Y como una observación inteligente, dado que nunca debe heredar de contenedores estándar, el rasgo original es simple: 'falso': P –
C++ 03. Yo uso el compilador msvc 2010. Por lo tanto, acepto usar 'decltype' además. 'std :: vector' es, por ejemplo, ony. Si no conoce la solución C++ 03, entonces la solución C++ 11 también es bienvenida. –