En una plantilla, quiero profundizar en el parámetro de plantilla al tipo real sin plantilla. Por lo tanto:Rasgos de tipo C++ para extraer la clase de parámetro de plantilla
template <typename T>
struct MyTemplate
{
// sadly there's no extract_Base
typedef typename extract_base<T>::MyType WorkType;
};
struct X {};
template <typename T> struct Templ {};
//MyTemplate<Templ<X>>::WorkType is X;
//MyTemplate<X>::WorkType is X;
La única solución que veo es verdadera para definir el tipo base como std :: vector <X> :: value_type es X. Pero tengo curiosidad si hay una manera de hacer esto sin definir los tipos de auxiliares en el interior cada plantilla de destino
Vi algo así como http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2965.html pero esto es borrador? y no lo entiendo del todo
Sí, sé que hay herencia múltiple, pero incluso para casos simples, sería bueno.
ACTUALIZACIÓN: la solución de Nawaz me funciona muy bien, y es fácil de extender a casos específicos, p.
template<template<typename, typename> class X, typename T1, typename T2>
struct extract_base <X<T1, T2>> //specialization
{
typedef T1 base;
};
Incluso puedo aplicar is_base_of u otros filtros a T1/T2 y así sucesivamente. Entonces funciona para X < T, U > - al menos con g ++ 4.6.7.
Esto no tiene nada que ver con la herencia o las clases base. –
Hay 'std :: is_base_of', pero eso puede no satisfacer sus propósitos por completo. – dirkgently