2016-05-03 18 views
1

私はこのコードを持っている:ブースト用に定義されていない== ::タプル

... 
#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::tupletuple_comparisonのエイリアスはこのケースを管理する必要がありますか?

ERROR FOUND、それを解決する方法がわからない:

エラーがstd::tie運転していたようです。したがって、次のように書き換えます。

auto key = noRef{ boost::make_tuple(args ...) }; 

うまく動作します。問題は、keyはタプル全体の潜在的に高価なコピーであり、tieは参照のタプル(はるかに小さい)であるため、このソリューションは非効率的であるということです。だから、どのように私はit->firstタプルへの参照を取ることができますか?私は同じtieのトリックを使うべきですか?この行がすべてでコンパイル

+0

これをインスタンス化するタイプは何ですか?タプルの 'operator =='はすべての要素型が 'operator =='をサポートしている場合にのみ機能します。 –

+0

ここで何をしようとしていますか? 'std :: tie(noRef {boost :: make_tuple(args ...)});'?また 'std :: tie'を使うことができれば、なぜ' std :: tuple'も使わないのでしょうか? – Nawaz

+1

また、 'const'は' const Args && 'で何をしますか? – Nawaz

答えて

2

唯一の理由は、非const左辺値参照は一時にバインドすることができますMSVCの悪拡張TMです:

auto key = std::tie(noRef{ boost::make_tuple(args ...) }); 

これは単に

auto key = boost::tie(args...); 

であるべきです後でルックアップに使用する参照のboost::tupleを作成します。

また、コメントに記載されているように、ifのチェックでは、逆参照しようとする前にit != cache.end()を最初に確認する必要があります(感謝!)。

最後に、const Args && ...は、constの値を受け入れることは望ましくないので、あまり意味がありません。おそらくconst Args&...またはArgs&&...のいずれかである必要があります。

関連する問題