c++ - boost::bind implicit conversion to boost::function or function pointer -
i'm using boost::function this:
template<class t1> void run(boost::function<void (t1)> func, string arg) { t1 p1 = parse<t1>(arg); func(p1); }
when used this, ok:
void test1(int i) { cout << "test1 i=" << << endl; } ... boost::function<void (int)> f = &test1; run(f, "42");
i want able pass raw function pointer directly, overload run() function this:
template<class t1> void run(void (*func)(t1), string arg) { t1 p1 = parse<t1>(arg); (*func)(p1); } ... run(&test1, "42"); // ok
now, want able pass result of boost::bind run() function. this:
void test2(int i, string s) { cout << "test2 i=" << << " s=" << s << endl; } ... run(boost::bind(&test2, _1, "test"), "42"); // edit: added missing parameter 42
but wont compile: edited
bind.cpp: in function ‘int main()’: bind.cpp:33:59: error: no matching function call ‘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)
how should overload run() accept boost::bind()?
edit 2
i know can this:
boost::function<void (int)> f = boost::bind(&test2, _1, string("test")); run(f, "42");
but i'd usage less verbose.
edit 3
changed run() prototype run(boost::function<void (t1)>, t1)
run(boost::function<void (t1)>, string)
elaborate actual use case. ref. igor r.'s answer
the entire source file may obtained here
neither function
nor result type of bind
convertible function pointer, can't pass them run
function current signature.
however, can change run
signature allow accepting callable:
template<class f, class a1> void run(f f, a1 arg) { f(arg); }
now can pass pointer function, binder, boost::function
or ever callable wish - long expects 1 argument. (note however, trivial signature run
wouldn't forward arguments f
seamlessly.)
Comments
Post a Comment