質問のタイトルがすべてを物語っていますが、再帰的なテンプレート関数の最初の呼び出しで関数をどのように実行しますか?
template<typename T, typename... Ts>
void print(T first, Ts... params) { ... }
注:私が使用しているbool
(b
関数は、それ自体から呼び出されなかった場合)を決定します。
void print(bool b = true, T first, Ts... params);
。print("hello");
コンパイラb
は"hello"
。で初期化されるため、1つの引数(つまり)のみで呼び出された場合は機能しません。void print(T first, bool b = true, Ts... params);
。print("hello", "world", "again");
コンパイラb
はパラメータパックの2番目のパラメータで初期化するため、複数の引数(つまり)では機能しません。void print(T first, Ts... params, bool b = true);
。パラメータパックの最後のパラメータで初期化されること2
を除いて、と同じb
です。私が欲しいのはこのようなものです(または必要に応じてテンプレート引数を含む他の何か(または完全に異なるもの))
template<typename T, typename... Ts>
void print(T first, Ts... params)
{
if (...) // Magic!
foo();
std::cout << first << '\n';
print(params...);
}
何か案は?
これを解決する1つの方法は、複数の関数を使用することです。外部関数は追加の呼び出しを行い、次に再帰的な内部関数を呼び出します。
void foo()
{
std::cout << "foo\n";
}
// satisfy the zero-parameter case
void internal_print()
{
}
// inner recursive function
template<typename T, typename... Ts>
void internal_print(T first, Ts... params)
{
std::cout << first << '\n';
internal_print(params...);
}
// outer special case function
template<typename... Ts>
void print(Ts... params)
{
foo();
internal_print(params...);
}
int main()
{
print(1, 2, "three", 4.0);
}
出力:
foo
1
2
three
4
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加