を使用して取ることができます検出します。次のオーバーロード・セットについては、例えばを考えてみましょう次のコードを引数の最大数の関数は、テンプレートメタプログラミング
:
void f(int, int); // f called with 2 ints compiles
void f(int, int, int); // f called with 3 ints compiles
void f(int, char, int, double); // f called with 4 ints compiles
void f(int, std::string, int, int, int); // f called with 5 ints does not compile
結果:
maximum_number_of_arguments<int>(f)
4
を返すべきです。
関数がとりうるパラメータの数を制限して(たとえば256)、すべての可能性をテストし、コンパイルに失敗しない呼び出しを追跡する方法を推測します。どのようにテンプレート/ contexprメタプログラミングでこれを行うには?
EDIT:私たちは機能に設定過負荷を渡すことができないという事実上のコメントに答えるために(f
と私の例では、おそらく最高ではありません):あなたが聞いて何
#include <iostream>
struct functor
{
void operator()(int) {std::cout << "int" << std::endl;}
void operator()(int, int) {std::cout << "int, int" << std::endl;}
void operator()(int, int, int) {std::cout << "int, int, int" << std::endl;}
};
template <class F>
void caller(F&& f)
{
std::forward<F>(f)(1);
std::forward<F>(f)(1, 2);
std::forward<F>(f)(1, 2, 3);
}
int main(int argc, char* argv[])
{
functor f;
caller(f);
return 0;
}
'printf'の答えはどうでしょうか? –
または 'template void foo(T ...)' –
Barry
"タイプの引数の最大数を見つけることができる関数が必要です。" - なぜですか?ユースケースは何ですか?面白くないですが、これはx-y問題のようなにおいがします。 –