неявное преобразование boost :: bind в указатель boost :: function или function

Я использую boost :: function вот так:

template<class T1>
void run(boost::function<void (T1)> func, string arg)
{
T1 p1 = parse<T1>(arg);
func(p1);
}

При таком использовании все в порядке:

void test1(int i)
{
cout << "test1 i=" << i << endl;
}

...

boost::function<void (int)> f = &test1;
run(f, "42");

Я хочу иметь возможность напрямую передавать необработанный указатель на функцию, поэтому я перегружаю функцию run () следующим образом:

template<class T1>
void run(void (*func)(T1), string arg)
{
T1 p1 = parse<T1>(arg);
(*func)(p1);
}

...

run(&test1, "42"); // this is OK now

Теперь я хочу иметь возможность передать результат boost :: bind в функцию run (). Как это:

void test2(int i, string s)
{
cout << "test2 i=" << i << " s=" << s << endl;
}

...

run(boost::bind(&test2, _1, "test"), "42"); // Edit: Added missing parameter 42

Но это не скомпилируется: отредактированный

bind.cpp: In function ‘int main()’:
bind.cpp:33:59: error: no matching function for call to ‘run(boost::_bi::bind_t<void, void (*)(int, std::basic_string<char>), boost::_bi::list2<boost::arg<1>, boost::_bi::value<std::basic_string<char> > > >, std::string)’
bind.cpp:33:59: note: candidates are:
bind.cpp:7:6: note: template<class T1> void run(boost::function<void(T1)>, std::string)
bind.cpp:14:6: note: template<class T1> void run(void (*)(T1), std::string)

Как перегрузить run (), чтобы принять boost :: bind ()?

Редактировать 2

Я знаю, что могу сделать это так:

boost::function<void (int)> f = boost::bind(&test2, _1, string("test"));
run(f, "42");

Но я бы хотел, чтобы использование было менее многословным.

Редактировать 3

Изменен прототип run () из run(boost::function<void (T1)>, T1) в run(boost::function<void (T1)>, string) разработать фактический вариант использования. Ссылка Ответ Игоря Р.

Весь исходный файл может быть получен Вот

0

Решение

ни function ни тип результата bind могут быть преобразованы в указатель на функцию, поэтому вы не можете передать их run функция с его текущей подписью.

Тем не менее, вы можете изменить run подпись, чтобы позволить ему принимать любые подлежащий выкупу:

template<class F, class A1>
void run(F f, A1 arg)
{
f(arg);
}

Теперь вы можете передать указатель функции, связыватель, boost::function или что нибудь подлежащий выкупу Вы хотите — до тех пор, пока он ожидает 1 аргумент. (Обратите внимание, что с этой тривиальной подписью run не будет вперед аргументы f без проблем.)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]