Me gustaría escribir una plantilla que pueda deconstruir un tipo en una plantilla con parámetros de plantilla sin tipo junto con sus argumentos de plantilla sin tipo. Por ejemplo, deconstruiría Array<5>
en template<int> Array
y 5
, pero funcionaría genéricamente para cualquier tipo de parámetro de plantilla sin tipo (tipos integrales, punteros, punteros de miembro, etc.).Resumiendo sobre tipos de parámetros de plantilla sin tipo
primer intento, con la especialización de plantilla:
template<typename T> struct foo { enum { n = 1 }; };
template<int x> struct bar { enum { n = x }; };
template<typename T, template<T> class X, T x>
struct foo< X<x> > { enum { n = x }; }; // here x must be of integral type, but that's just for testing
int main(int, char**) { return foo< bar<16> >::n; }
Clang 3.1 dice:
test145.cpp:6:8: warning: class template partial specialization contains a template parameter that can not be deduced; this partial specialization will never be used
struct foo< X<x> > { enum { n = x }; };
^~~~~~~~~~~
test145.cpp:5:19: note: non-deducible template parameter 'T'
template<typename T, template<T> class X, T x>
^
1 warning generated.
segundo intento, con una plantilla de función:
template<typename T, T x>
struct box
{
static constexpr T value() { return x; }
};
template<typename T, template<T> class X, T x>
box<T, x> foo(X<x>);
template<int> struct asdf { };
int main(int, char**) { return decltype(foo(*(asdf<9>*)0))::value(); }
Clang dice:
test150.cpp:12:41: error: no matching function for call to 'foo'
int main(int, char**) { return decltype(foo(*(asdf<9>*)0))::value(); }
^~~
test150.cpp:8:11: note: candidate template ignored: couldn't infer template argument 'T'
box<T, x> foo(X<x>);
^
1 error generated.
GCC 4.7 dice cosas similares.
¿Es esto una limitación fundamental?
Pregunta adicional: Si es así, ¿hay alguna manera de manejar todas las infinitas posibilidades en una cantidad finita de código, incluso si es un código menos simple y genérico? (Se pone difícil con, por ejemplo, punteros: por la misma razón que parece que no puede escribir template<T>
tampoco creo que pueda escribir template<T*>
)
No pregunte por qué lo estoy preguntando.
Debo decir: no entiendo exactamente lo que necesita –
Creo que se podría resumir de la siguiente manera: Deje 'plantilla struct A {}'.¿Es posible (y si es así, cómo) escribir una plantilla 'arg' tal que' arg > :: template_' es 'template Array',' arg > :: type' es 'int', y' arg > :: value' es '5' (y de tipo' int'), y también lo hace tan genérico que cada posible argumento de plantilla sin tipo se puede manejar de esta manera. –
reima
Eso es básicamente eso. ¡Gracias por expresarlo más claro de lo que pude! – glaebhoerl