任意の数の引数を受け入れる可変個引数テンプレートを使用して関数を作成するのは簡単です。一般的なパターンとの唯一の違いは、具体的な型がテンプレート パラメーターの代わりに最初の引数 (ヘッド) として使用されることです。foobar
次の例は、任意の数の文字列を受け入れる関数を示しています。
// used for end of recursion - and for the empty arguments list
void foobar() { }
template <typename ...Tail>
void foobar(const std::string& head, Tail&&... tail)
{
// do something with head
std::cout << head << '\n';
// call foobar recursively with remaining arguments
foobar(std::forward<Tail>(tail)...);
}
foobar("Hello", "World", "...");
個人的にstd::initializer_list
は、可変個引数テンプレートの代わりに使用することを好みます。可変個引数テンプレートはより複雑で、追加の経験が必要になるためです。ではstd::initializer_list
、次のようになります。
void foobar(std::initializer_list<std::string> values)
{
for (auto& value : values) {
// do something with value
std::cout << value << '\n';
}
}
foobar({ "Hello", "World", "...", });
std::initializer_list
残念ながら、通常の関数で使用する場合は、中括弧を追加する必要があります。新しいイニシャライザ構文が使用されている場合、コンストラクタには必要ありません。
編集:フィードバックに従って回答を書き直しました。特に、2 つのソリューション/例の順序を変更しました。