可変個引数テンプレートのコンテキストでは、省略記号...
は、式の右側に表示される場合はテンプレート パラメーター パックをアンパックするために使用されます (この式パターンを少し呼び出します)。または、それが式の左側に表示される場合はパック引数です。名前:
...thing // pack : appears as template arguments
thing... // unpack : appears when consuming the arguments
ルールは、 の左側にあるパターン...
が繰り返されるということです — アンパックされたパターン (ここでは式と呼びます) はコンマで区切られます,
。
いくつかの例を見るとよく理解できます。次の関数テンプレートがあるとします。
template<typename ...T> //pack
void f(T ... args) //pack
{
// here are unpack patterns
g( args... ); //pattern = args
h( x(args)... ); //pattern = x(args)
m( y(args...) ); //pattern = args (as argument to y())
n( z<T>(args)... ); //pattern = z<T>(args)
}
この関数を として渡すT
と{int, char, short}
、各関数呼び出しは次のように展開されます。
g( arg0, arg1, arg2 );
h( x(arg0), x(arg1), x(arg2) );
m( y(arg0, arg1, arg2) );
n( z<int>(arg0), z<char>(arg1), z<short>(arg2) );
投稿したコードでは、関数呼び出しでstd::forward
示されている 4 番目のパターンに従います。n()
x(args)...
上記との違いに注意y(args...)
!
...
次のように配列を初期化するために使用することもできます。
struct data_info
{
boost::any data;
std::size_t type_size;
};
std::vector<data_info> v{{args, sizeof(T)}...}; //pattern = {args, sizeof(T)}
これは次のように展開されます。
std::vector<data_info> v
{
{arg0, sizeof(int)},
{arg1, sizeof(char)},
{arg2, sizeof(short)}
};
public
次の例に示すように、パターンに などのアクセス指定子を含めることもできることに気付きました。
template<typename ... Mixins>
struct mixture : public Mixins ... //pattern = public Mixins
{
//code
};
この例では、パターンは次のように展開されます。
struct mixture__instantiated : public Mixin0, public Mixin1, .. public MixinN
つまり、すべての基本クラスからパブリックmixture
に派生します。
それが役立つことを願っています。