関数オブジェクトの std::equal_to、std::greater などのファミリに一般的に相当する関数オブジェクトがブーストにありますか?
基本的に、 std::equal_to は次のようになります
struct generic_equal_to
{
template <class T, class U>
bool operator()(const T& t, const U& u) const
{
return t == u;
}
};
std::plus などのジェネリック バージョンが、戻り値の型の問題によりトリッキーになる可能性があることがわかります (ただし、それdecltype
は解決できます)。ただし、 std::equal_to 関数オブジェクト自体がテンプレート引数を必要とする理由は考えられません。
これらのバージョンは、ブーストまたは STL のどこかに存在するのでしょうか? もちろん、それらを書くのは簡単ですが、私はライブラリ コードを複製することを非常に嫌います。
編集:
ラムダや別の関数オブジェクト生成方法を使用する代わりに、なぜこれが必要なのかについてのコンテキストとして:
したがって、一般的なboost::fusion
シーケンス比較関数を作成していました。
template <class T>
bool sequence_equal(const T& left, const T& right)
{
return fusion::all(
fusion::zip(left, right),
fusion::fused<generic_equal_to>());
}
事実上、または関数オブジェクトを型でfusion::fused<generic_equal_to>
指定できないという問題につながる部分に注意してください。1つの解決策はdecltypeかもしれないと思います:boost::lambda
boost::phoenix
fusion::fused<decltype(_1 == _2)>()
boost::lambda
しかし、それは非常に厄介なようで、実装方法や実装によってはうまくいかないかもしれませんboost::phoenix
- 私にはよくわかりません.
fusion::make_fused
を使用してこの問題全体を回避できることは知っていますが、関数オブジェクトをインスタンス化する必要があります。私が考えた解決策は、テンプレートではないequal_to
構造体です。私は mine と呼びましたgeneric_equal_to
。
私はそれが非常に些細な問題であることを知っていmake_fused(_1 == _2)
ますfused<generic_equal_to>
. generic_equal_to
ブーストやSTLのどこにも関数オブジェクトがないとは信じられなかったので、この質問です。