Ovviamente, non si può avere un'istanza di tipo void
in un programma ben formato, in modo da qualcosa come la seguente dichiarazione non verrà compilato:tipo Void in std :: tuple
std::tuple<void, double, int> tup;
Tuttavia, come Finché abbiamo a che fare strettamente con i tipi rispetto agli oggetti, non sembra esserci alcun problema. Ad esempio, il mio compilatore (GCC) mi permette di dire:
typedef std::tuple<void, double, int> tuple_type;
Questo è interessante per me, perché sembra che con il C++ 0x possiamo semplicemente usare std::tuple
per eseguire un sacco di trucchi meta-programmazione che prima avrebbe richiesto la libreria boost::mpl
. Ad esempio, possiamo usare std::tuple
per creare un vettore di tipi.
Per esempio, supponiamo di voler creare un vettore di tipi che rappresentano una firma di funzione:
solo possiamo dire:
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;
};
Questo sembra funzionare, anche se la firma funzione ha un void
digita, purché non istanziamo mai un'istanza di get_function_signature<F>::type
.
Tuttavia, C++ 0x è ancora nuovo per me, e, naturalmente, tutte le implementazioni sono ancora un po 'di sperimentazione, quindi sono un po' a disagio per questo. Possiamo davvero usare std::tuple
come un vettore di tipi per la meta-programmazione?
Prevedo che 'boost :: mpl :: vector' sia deprecato. In ogni caso la maggior parte della funzionalità 'boost :: mpl' e la metaprogrammazione del template in generale cambieranno considerevolmente quando il supporto per i modelli variadici aumenterà. –