は、あなたはよく形成され、プログラムでタイプvoid
のインスタンスを持つことができないので、次の宣言のようなものがコンパイルされません。void型::明らかにタプル
std::tuple<void, double, int> tup;
しかし、としてオブジェクトとは対照的に型を厳密に扱っている限り、問題はないようです。例えば、私のコンパイラ(GCC)は、私が言うことができます:
typedef std::tuple<void, double, int> tuple_type;
C++ 0xで私達はちょうどそのメタプログラミングのトリックの多くを実行するためにstd::tuple
を使用できるようですので、これは、私には興味深いものです以前はboost::mpl
ライブラリが必要でした。たとえば、std::tuple
を使用して型のベクトルを作成できます。
たとえば、私たちは関数のシグネチャを表すタイプのベクトルを作成したいとします
私達はちょうど言うことができます:
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;
};
これは、関数の署名がvoid
を持っている場合でも、動作しているようですが実際にはget_function_signature<F>::type
のインスタンスをインスタンス化することはできません。
しかし、C++ 0xはまだ私には新しく、もちろんすべての実装はまだやや実験的なので、これについて少し不安です。メタプログラミングのタイプのベクトルとして実際にstd::tuple
を使用できますか?
私は 'boost :: mpl :: vector'が推奨されなくなると考えています。とにかく、boost :: mpl'機能とテンプレートメタプログラミングの大部分は、バリデーショナルテンプレートのサポートが増えるとかなり変化します。 –