15

私は実際に、次のようなPythonの「*」演算子に似たものを考えています:

args = [1,2,4]
f(*args)

C++ に同様のソリューションはありますか?

私が思いつくことができるのは次のとおりです。

template <size_t num_args, typename FuncType>
struct unpack_caller;

template <typename FuncType>
struct unpack_caller<3>
{
    void operator () (FuncType &f, std::vector<int> &args){
        f(args[0], args[1], args[3])
    }
};

int上記では、引数の型のみを想定しています。

問題は、異なる値の unpack_caller のすべての特殊化を記述するのが面倒だと感じていることですnum_args

これに対する良い解決策はありますか?ありがとう。

4

2 に答える 2

15

インデックスのパックを使用できます:

template <size_t num_args>
struct unpack_caller
{
private:
    template <typename FuncType, size_t... I>
    void call(FuncType &f, std::vector<int> &args, indices<I...>){
        f(args[I]...);
    }

public:
    template <typename FuncType>
    void operator () (FuncType &f, std::vector<int> &args){
        assert(args.size() == num_args); // just to be sure
        call(f, args, BuildIndices<num_args>{});
    }
};

ただし、テンプレートでサイズを指定する必要をなくす方法はありません。ベクターのサイズは実行時の構成要素であり、コンパイル時にサイズが必要になるためです。

于 2012-06-15T04:27:29.907 に答える