がSTDに、一般的な等価物である:: equal_toブーストで任意の関数オブジェクトあり関数オブジェクトのなど家族をオブジェクト?ジェネリック同等ではstd ::大きい、
基本的に、のstd :: equal_toは
struct generic_equal_to
{
template <class T, class U>
bool operator()(const T& t, const U& u) const
{
return t == u;
}
};
のようなものになるはずdecltype
ができますが、私は(戻り値の型に起因する問題のためにトリッキーかもしれませんどのようにジェネリックのstd ::バージョンプラスなど見ることができますそれを解決する)。私は、なぜstd :: equal_to関数オブジェクト自体がテンプレート引数を必要とする必要があるのか考えられません。きっとどこかにブーストまたはこれらのバージョンが存在するSTLで
?もちろん書くことは簡単ですが、私は非常にライブラリコードの複製を嫌っています。特にこのようなことは明らかではありません。
EDIT:私は以下のようなものを、一般的な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>());
}
注意あなたが実質的に指定することはできませんISSEにつながるfusion::fused<generic_equal_to>
一部、boost::lambda
またはboost::phoenix
タイプごとの機能オブジェクト。私は一つの解決策は、decltypeかもしれない推測:
fusion::fused<decltype(_1 == _2)>()
けれども非常に厄介なようだ、とさえboost::lambda
またはboost::phoenix
がどのように実装されるかに応じて、動作しないことがあります - 私は本当にわかりません。
私はあなたがこの全体の問題を回避するためにfusion::make_fused
を使用することができます知っているが、その後は関数オブジェクトをインスタンス化する必要があります。私が考えた解決策は、その後、非テンプレートequal_to
構造体だろう - 私は私generic_equal_to
と呼ばれます。
私はそれが非常に些細な問題だと知っています。結局のところ、make_fused(_1 == _2)
はおそらくfused<generic_equal_to>
と同じアセンブリにインラインでダウンします。私はちょうどので、どこにでもSTL、ブーストまたはにはgeneric_equal_to
関数オブジェクト、この質問がなかったことを信じることができませんでした。
私はあなたが '演算子()(のconst T&T、のconst U&U)' –
1を意味すると思うが、私はあなたがサポートされています1を見つけるとは思いません。この問題は重要です(私は昨日このコードを[回答](http://stackoverflow.com/questions/10063037/unordered-set-storing-elements-as-pointers/10063081#10063081)に書いていますが、それはBoostの開発者を引き付けるほどセクシーではなく、 'std :: equal_to'は標準化委員会がそれを廃止するのに十分なほど壊れていません。 – Potatoswatter
@ AndrewTomazos-Fathomling hah yep!コンピュータを使わずにコードを書いて、構文をチェックしようとしています*常に*どこかで私を動かす – Ayjay