No es posible. La forma habitual de hacerlo es la siguiente:
template<int N>
struct foo {
static const int value = N;
};
y para este tipo de
template<typename T>
struct foo {
typedef T type;
};
Puede acceder a ella a continuación como foo<39>::value
o foo<int>::type
.
Si usted tiene un tipo particular, puede utilizar parcial especialización de plantilla:
template<typename>
struct steal_it;
template<std::size_t N>
struct steal_it< std::bitset<N> > {
static const std::size_t value = N;
};
El mismo principio es posible que los parámetros de tipo también, por cierto. Ahora puede pasar cualquier conjunto de bits, como steal_it< std::bitset<16> >::value
(tenga en cuenta que use size_t, no int!). Debido a que todavía no tenemos muchos parámetros de plantilla, tenemos que limitarnos a un conteo de parámetros en particular, y repetir las especializaciones de la plantilla de steal_it para contar desde 1 hasta N. Otra dificultad es explorar tipos que tienen parámetros mixtos (tipos y no tipos de parámetros). Probablemente esto no sea trivial de resolver.
Si usted no tiene el tipo, pero sólo un objeto de la misma, se puede utilizar un truco, que aún así obtener un valor en tiempo de compilación:
template<typename T>
char (& getN(T const &))[steal_it<T>::value];
int main() {
std::bitset<16> b;
sizeof getN(b); // assuming you don't know the type, you can use the object
}
El truco es hacer que la plantilla de función automática deducir el tipo, y luego devolver una referencia a una matriz de caracteres. La función no necesita ser definida, lo único que se necesita es su tipo.
Buen truco. Una cosa, sin embargo, comienzas diciendo que no es posible, ¡pero luego procedes a demostrar que sí! :) –
@Richard Corden: Creo que estaba diciendo que no es posible hacerlo con RTTI – cdleary
Richart Corden. Quise decir que generalmente no es posible seleccionar parámetros de plantilla arbitrarios. considere esto: plantilla clase, clase, tamaño_t> clase foo; ese truco no tendrá sus tipos :) –