1

boost ::fusion :: invoke関数を使用して、デフォルトの引数を持つ関数を指定せずに呼び出すことは可能ですか?

Example:

void foo(int x, int y = 1, int z = 2)
{
  std::cout << "The sum is: " << (x + y + z) << std::endl;
}

...

// This should call foo(0). It doesn't work because the type of foo is void (*) (int, int, int).
boost::fusion::invoke(foo, boost::fusion::vector<int>(0));

// Works
boost::fusion::invoke(foo, boost::fusion::vector<int, int, int>(0, 1, 2));

スクリプト言語にバインドするためのラッパーを作成しています。デフォルトの引数を使用すると、ラッパーのユーザーの直感的な感覚が大幅に向上します。規格はこのケースをカバーしていませんが、私は恐れています。

補足:
ファンクターを使用して回避できることはわかっています。

struct foo  {
  void operator() (int x, int y = 1, int z = 2)  { /* ... */ }
};

// Works because the functor adds an indirection
boost::fusion::invoke(foo(), boost::fusion::vector<int>(0));

ただし、デフォルトの引数を指定するためだけにユーザーにファンクターを作成させたくないので、これはオプションではありません。

4

1 に答える 1

1

使用できますbind詳細):

boost::fusion::invoke(boost::bind(foo, _1, 1, 2), boost::fusion::vector<int>(0));
于 2010-08-21T12:56:14.513 に答える