Obviamente, no se puede tener una instancia de tipo void
en un programa bien formado, así que algo como la siguiente declaración no se compilará:tipo void en std :: tupla
std::tuple<void, double, int> tup;
Sin embargo, como Siempre que tratemos estrictamente tipos en lugar de objetos, no parece haber ningún problema. Por ejemplo, mi compilador (GCC) me permite decir:
typedef std::tuple<void, double, int> tuple_type;
Esto es interesante para mí, porque parece que con C++ 0x podemos simplemente utilizar std::tuple
para llevar a cabo una gran cantidad de los trucos de programación que los meta antes habría requerido la biblioteca boost::mpl
. Por ejemplo, podemos usar std::tuple
para crear un vector de tipos.
Por ejemplo, supongamos que queremos crear un vector de tipos que representan una función de firma:
Sólo podemos decir:
template <class R, class... Args>
struct get_function_signature;
template <class R, class... Args>
struct get_function_signature<R(*)(Args...)>
{
typedef std::tuple<R, Args...> type;
};
Esto parece funcionar, incluso si la firma de la función tiene un void
tipo, siempre que nunca instanciamos una instancia de get_function_signature<F>::type
.
Sin embargo, C++ 0x todavía es nuevo para mí, y por supuesto todas las implementaciones son aún algo experimentales, así que estoy un poco incómodo con esto. ¿Podemos realmente usar std::tuple
como un vector de tipos para meta-programación?
Espero que el 'boost :: mpl :: vector' sea obsoleto. De todos modos, la mayoría de la funcionalidad 'boost :: mpl' y metaprogramación de plantillas en general cambiará considerablemente cuando aumente el soporte para plantillas variadic. –