Podría, por supuesto, usar is_base
si la clase base no es una plantilla. Sin embargo, cuando lo es, simplemente no veo ninguna forma de hacer coincidir genéricamente ningún tipo derivado. Aquí hay un ejemplo básico de lo que quiero decir:¿Es posible hacer coincidir la base de plantilla en las especializaciones de plantilla?
#include <boost/mpl/bool.hpp>
template < typename T >
struct test_base
{
};
template < typename T >
struct check : boost::mpl::false_ {};
template < typename T >
struct check<test_base<T> > : boost::mpl::true_ {};
struct test_derived : test_base<int> {};
#include <iostream>
int main()
{
std::cout << check<test_derived>::value << std::endl;
std::cin.get();
}
Quiero que volver a true_
en lugar de false_
. El ejemplo real tiene como 7 parámetros de plantilla, la mayoría de ellos predeterminados, y usa Boost.Parameter para referirse a ellos por su nombre. Para usar is_base
tendría que ser capaz de extraer los parámetros de alguna manera y no veo una manera de hacerlo menos de declarar typedefs internos.
Creo que es imposible. Buscando ser probado equivocado.
puede presentarle tipo de etiqueta única en la base de prueba y desactivar/activar basa en eso? – Anycorn
Esa es una opción viable que debería haber pensado de mí mismo. Sin embargo, todavía está interesado si alguien puede encontrar un camino sin él. –
@aaa - deberías hacer una respuesta. Tengo la sensación de que es el único método posible, así que en un par de días después de que no recibo una respuesta, es mejor que me den crédito por ello. –