1

関数テンプレートでは、アリティ (引数の数) に応じて、関数または関数オブジェクトを別の方法で呼び出したいと思います。擬似コード:

if arity(f) == 1:
    f(x)
if arity(f) == 2:
    f(x, y)
if arity(f) == 3:
    f(x, y, z)

これはC++でどのように行うことができますか?

編集難しさを明確にするために:引数が 2 つしかf(x, y, z)ない場合はコンパイルされずf、逆に引数が 3 つ必要なf(x, y)場合はコンパイルされませんf

4

1 に答える 1

2

C++11 の場合:

#include <iostream>

template <typename F> struct Traits;

template <typename R, typename... A>
struct Traits<R (A...)>
{
    static constexpr unsigned Arity = sizeof...(A);
};

void f(int, int, int);

int main() {
    std::cout
        << Traits<void()>::Arity
        << Traits<void(int)>::Arity
        << Traits<void(int, int)>::Arity
        << Traits<decltype(f)>::Arity
        << '\n';
    return 0;
}

それ以外の場合は、boost::function を検索できます: http://www.boost.org/doc/libs/1_55_0b1/doc/html/function.html

于 2014-01-25T10:36:32.080 に答える