現状では、「構文エラー」以外の意味はほとんどありません。例えば:
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
.