Boost.Fusion Functional: вызов функций с аргументами по умолчанию - PullRequest
1 голос
/ 21 августа 2010

Можно ли использовать функцию 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));

Однако это не вариант, так как я не хочу заставлять пользователей создавать функторы только для указания аргументов по умолчанию.

1 Ответ

1 голос
/ 21 августа 2010

Вы можете использовать bind ( больше информации ):

boost::fusion::invoke(boost::bind(foo, _1, 1, 2), boost::fusion::vector<int>(0));
...