この bind の呼び出しが機能しない理由が少しわかりません。私は問題をバインドの新しい呼び出しでバインド オブジェクトをネストしようとすることに絞り込みました。
#include <iostream>
#include <algorithm>
#include <tr1/functional>
using namespace std;
using tr1::bind;
using namespace std::tr1::placeholders;
double times_2(double a) {
return 2*a;
}
void print_num(double a) {
cout << a << endl;
}
template <typename Oper>
void oper_on_list(Oper op) {
int list[] = {0,1,2,3,4};
for_each(list, list+5, bind(print_num, bind(op, _1))); // This works!
for_each(list, list+5, bind(print_num, bind(op, bind(op, _1)))); // This doesn't!
}
int main() {
oper_on_list(bind(times_2, _1));
return 0;
}
ここでno matching function for call to 'bind'
、コンパイラからメッセージを受け取ります。(G++ 4.2.1 または Apple LLVM 3.0)。
(実際にはno matching function for call to object of type 'std::tr1::_Bind<double (*(std::tr1::_Placeholder<1>))(double)>'
)
ここでの目標は、別のバインドでバインド オブジェクトを再利用することでした。要約すると、問題は、2 番目のバインド呼び出しの結果を、既に作成されたバインド呼び出しの引数として使用することです。これを回避する方法はありますか?
これも状況を少し明らかにするのに役立つと思いますか?:
template <typename T>
void print(T t) {
cout << t << endl;
}
template <typename Oper>
void oper_on_list(Oper op) {
int list[] = {0,1,2,3,4};
for_each(list, list+5, bind(print, bind(op, _1))); // This doesn't work
for_each(list, list+5, bind(print<double>, bind(op, _1))); // This does
for_each(list, list+5, bind<void(*)(double)>(print, bind(op, _1))); // So does this!
}
ここでの問題は、 に基づいて印刷用のテンプレート仕様を推測するのに問題があることだと思いますbind(op, _1)
。なぜできないのかはわかりませんが..
しかし、どちらにしても、それを指定することで問題が解決するようです。残念ながら、元の例でテンプレートを指定する方法がわかりませんOper
。
どんな助けでも大歓迎です!:Dありがとう!
============================
アップデート!これは C++11 で正しくコンパイルされることがわかりました。問題は、これが C++11 なしでコンパイルされないのはなぜですか? 私の知る限り、C++11 固有の機能はありません。C++11 なしでこれと同じタスクを達成する方法はありますか? おそらく、コードを設定する別の方法ですか?
============================
アップデート2!まあ、これはboost::bindで動作するので、単にtr1::bindの問題だと思います..