2011-05-20 8 views
5

Quiero determinar si una plantilla de clase variable es la base de otra clase. Normalmente usaría std :: is_base_of, pero no creo que mi caso de uso se ajuste, y no estoy seguro si ya hay algo en std o boost para manejar esto. Quiero que el paquete de parámetros de la plantilla de la clase básica varíe provenga de otra plantilla de clase variadic. Aquí hay un código de ejemplo que se espera que explica lo que quiero hacer:¿Extrae el paquete de parámetros de plantilla variadic y lo usa en otra plantilla variadic en una metafunción de rasgos de tipo?

Uso:

is_variadic_base_of< 
    VarClassTemplA 
    , ClassDerivedFromA 
    , VarClassTemplB //Has param pack I want to use with ClassA 
>::value; 

Tripas:

//test for variadic base of non-variadic 
template <template<typename...> class A, typename B, typename... ArgsC> 
struct is_variadic_base_of 
: std::is_base_of<A<ArgsC...>, B> 
{}; 

es esto posible?

Respuesta

5
template <template<typename...> class A, typename B, typename ArgsC> 
struct is_variadic_base_of; 

template <template<typename...> class A, typename B, 
      template<typename...> class C, typename ...ArgsC> 
struct is_variadic_base_of<A, B, C<ArgsC...>> 
: std::is_base_of<A<ArgsC...>, B> 
{}; 

Espero que ayude!

+0

No estoy seguro si algo cambia, pero lo hice una pequeña edición de 'VarTemplClassB ', ahora es solo 'VarTemplClassB'. –

+1

@Johannes: ¡Boo, algunos segundos! :( – Xeo

+0

Lol, no sé cuántas permutaciones probé y no aterrizó en este. Funciona perfecto. Gracias! –

4

estás muy cerca, pero lo intenta con una especialización parcial:

template< 
    template<class...> class A, class B, class C 
> 
struct is_variadic_base_of; 

// partial spec 
template< 
    template<class...> class A, class B, 
    template<class...> class C, class... ArgsC 
> 
struct is_variadic_base_of< A,B,C<ArgsC...> > 
    : std::is_base_of< A<ArgsC...>,B > 
{}; 
+0

Bueno, probé varias cosas. Todavía no entiendo cómo cortar cosas con especializaciones, pero me estoy poniendo allí. SOY píos han sido de gran ayuda! –

+0

@pheedbaq: ¡Fighto! ;) Pero debo admitir, este material de especialización parcial es una parte de TMP que realmente me gusta, especialmente la coincidencia de patrones que permite. – Xeo

+0

Lo mismo aquí. Siempre estoy impresionado con las cosas que TMP puede hacer, a pesar de cualquier sintaxis de patito feo. Solo el hecho de que estas cosas se puedan hacer en primer lugar, junto con todo lo demás que hace el lenguaje ... es realmente increíble. –

Cuestiones relacionadas