現状では、「構文エラー」以外の意味はほとんどありません。例えば:
template<T, Op>
これは単に許可されていません。テンプレート パラメーターごとに、型 (classまたはを使用typename) か、 などの型以外のパラメーターかを指定する必要がありますint。明らかな意図は、これらの両方が型パラメーターであるべきであるため、次のようなものが必要です。
template <class T, class Op>
また:
template <typename T, typename Op>
classこの状況では、との間に意味の違いはありませんtypename。
struct bind{
T v;
初期化されていないままにしておくと、未定義vの動作が発生するため、おそらく許可したくないでしょう。通常は、パラメーターとして T を受け取り、その値に初期化するコンストラクターを追加することで、これを防ぐことができvます。
bind(T const &v) : v(v) {}
このようなコンストラクターを含めると、コンパイラーはデフォルトのコンストラクターを自動的に生成しないため、初期化されていないbindオブジェクトを作成することはできなくなりますv。まさに私たちが望んでいたものです。
compオブジェクトを作成していますが:
Op comp;
かなり無害ですが、不要でもあります。で作成された一時インスタンスと比較することもできますOp()。その場合は次のようになります。
bool operator()(const T& a){
return comp(a,v);
}
...次のようになります(そしてOp comp;単に削除されます):
bool operator()(T const &a) {
return Op()(a, v);
}
修正があっても、このコードは時代遅れだと思います。C++98/03 では、次のようなアルゴリズムにファンクターを提供する必要がある状況で役立ちました。
std::remove_copy_if(a.begin(), a.end(), bind<int,
std::back_inserter(b),
bind<int, std::less<int> >(5));
... から までの数値をコピーaしb、5 未満の数値を削除します。
ただし、C++11 では、これのほとんど (すべてではないにしても) の使用はbindおそらく代わりにラムダとして記述される必要があるため、上記のビットは次のようになります。
std::remove_copy_if(a.begin(), a.end(), bind<int,
std::back_inserter(b),
[](int x) { return x < 5; });
これは短いだけでなく、(少なくとも慣れれば)関数を使用std::lessしbindてまとめるよりもかなり簡単です。通常、実行時の効率に違いはありません。ラムダは基本的に、クラス テンプレートを生成する「省略形」の方法であるため、ラムダが生成するものは、bind.