2017-10-27 2 views
1

これは私がパラメータリストの左辺値/右辺値の種類に基づいてタプル(またはペア)のタプルを作成したいと思い、質問Is there a way to convert a list of lvalues and rvalues to a tuple with reference types and full types respectively?lvaluesとrvaluesのリストを参照型と完全型のタプルのタプルに変換する方法はありますか?

のパート2です。これは私がこれまで持っているものです。

#include <tuple> 
using LPCWSTR = wchar_t const*; 

namespace detail 
{ 
    template <typename T> 
    struct VarVal : std::pair<LPCWSTR, T> 
    { 
     // Importing the base constructors so I don't have to redefine them 
     using std::pair<LPCWSTR, T>::pair; 
     VarVal(VarVal const&) = delete; // copy could be made valid, but I don't want it copied around. 
     VarVal(VarVal&&) = default; // would rather that no copying/moving be done, but not sure how 
    }; 
} 

// lvalue 
template <typename T> 
detail::VarVal<std::reference_wrapper<T&>> vv(LPCWSTR var, T& val) 
{ 
    return{ var, val }; 
} 

// rvalue 
template <typename T> 
detail::VarVal<T const> vv(LPCWSTR var, T&& val) 
{ 
    return{ var, val }; 
} 

struct SomeType 
{ 
    int x; 
    auto GetLeft() const { return 1; } 
    auto& GetRight() const { return x; } 
}; 

auto varvals(SomeType const& object) 
{ 
    return make_tuple(
     vv(L"left", object.GetLeft()), 
     vv(L"right", object.GetRight()) 
    ); 
} 

Demo

これは右辺値のために動作しますが、私は左辺値のためにそれを使用するとき、それは私が何をしないのですreference_wrapper<T> requires T to be an object type or a function type.

を言ってbarfs?

答えて

0

私は何が欠けていますか?

template <typename T> 
detail::VarVal<std::reference_wrapper<T>> vv(LPCWSTR var, T& val) 
{ 
    return{ var, val }; 
} 

std::reference_wrapper<T>

、ない std::reference_wrapper<T&>

+0

でなければなりません睡眠剥奪。ありがとう。 – Adrian

関連する問題