私はこのコードを持っている:ブースト用に定義されていない== ::タプル
...
#include "boost/tuple/tuple_comparison.hpp"
...
template <typename ReturnType, typename... Args>
function<ReturnType(Args...)> memoize(const Args && ... args)
{
using noRef = boost::tuple<typename std::remove_reference<Args>::type...>;
static map<noRef, ReturnType, less<>> cache;
auto key = std::tie(noRef{ boost::make_tuple(args ...) });
auto it = cache.lower_bound(key);
ReturnType result;
if (it->first == key) { ...
をしかし、私はそれをコンパイルしようとしたとき、私はこのエラーが表示されます。
error C2678: binary '==': no operator found which takes a left-hand operand of type 'const noRef' (or there is no acceptable conversion)
noRef
があるので、これは、なぜ起こりますかboost::tuple
とtuple_comparison
のエイリアスはこのケースを管理する必要がありますか?
ERROR FOUND、それを解決する方法がわからない:
エラーがstd::tie
運転していたようです。したがって、次のように書き換えます。
auto key = noRef{ boost::make_tuple(args ...) };
うまく動作します。問題は、key
はタプル全体の潜在的に高価なコピーであり、tie
は参照のタプル(はるかに小さい)であるため、このソリューションは非効率的であるということです。だから、どのように私はit->first
タプルへの参照を取ることができますか?私は同じtie
のトリックを使うべきですか?この行がすべてでコンパイル
これをインスタンス化するタイプは何ですか?タプルの 'operator =='はすべての要素型が 'operator =='をサポートしている場合にのみ機能します。 –
ここで何をしようとしていますか? 'std :: tie(noRef {boost :: make_tuple(args ...)});'?また 'std :: tie'を使うことができれば、なぜ' std :: tuple'も使わないのでしょうか? – Nawaz
また、 'const'は' const Args && 'で何をしますか? – Nawaz