0

私は次のように 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)

boost::bind() を受け入れるには、run() をオーバーロードするにはどうすればよいですか?

編集 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)て、実際のユース ケースを詳しく説明しました。参考文献 Igor R.の答え

ソースファイル全体はここから入手できます

4

1 に答える 1