C++ 包装类的完美转发

C++ 包装类的完美转发,c++,c++11,forwarding,C++,C++11,Forwarding,例如,我有一个包装器类: template <typename T> struct Wrapper { T t; }; 现在,为了方便起见,有一个方法可以创建代理,我编写了重载方法,用于l值和r值引用: template <typename T> Proxy<const T &> createProxy(const Wrapper<T> &w) {return {w.t};} template <typename

例如,我有一个包装器类:

template <typename T>
struct Wrapper {
    T t;
};
现在,为了方便起见,有一个方法可以创建代理,我编写了重载方法,用于l值和r值引用:

template <typename T>
Proxy<const T &> createProxy(const Wrapper<T> &w) {return {w.t};}

template <typename T>
Proxy<T> createProxy(Wrapper<T> &&w) {return {std::move(w.t)};}
模板
Proxy-createProxy(const-Wrapper&w){return{w.t};}
模板
Proxy-createProxy(Wrapper&&w){return{std::move(w.t)};}
这当然只是我想使用的精简代码,但为了让所有内容更具可读性,我想使用一些完美的转发魔法,减少代码,让所有内容更具可读性:

template <typename Wrapper>
Proxy</* ??? */> createProxy(Wrapper &&w) { /* ??? */ }
模板
代理createProxy(包装器和&w){/*???*/}
所以问题是,我如何扣除l值或r值类型成员的l值或r值类型?

std::forward(w)。t
w
具有相同的值类别,因此您只需返回一个
代理,其中
decltype((std::forward(w.t))
:

模板
结构删除\u右值\u引用{
使用类型=T;
};
模板
结构删除\u右值\u引用{
使用类型=T;
};
模板
使用remove\u rvalue\u reference\u t=typename remove\u rvalue\u reference::type;
模板
自动创建代理(包装器(&w)->
代理{
返回{std::forward(w).t};
}

我不知道你想问什么(为什么你只在最后1到最多3段才开始问这个问题)。
std::remove\u rvalue\u reference
做的和上面一样,对吗?@user1447257如果有
std::remove\u rvalue\u reference
,那就是它会做的。有,还有,但是没有
删除\u右值\u参考
。啊,是的,刚刚看到我对文档的误读。无论如何,谢谢你!
template <typename Wrapper>
Proxy</* ??? */> createProxy(Wrapper &&w) { /* ??? */ }
template <typename T>
struct remove_rvalue_reference {
    using type = T;
};

template <typename T>
struct remove_rvalue_reference<T&&> {
    using type = T;
};

template <typename T>
using remove_rvalue_reference_t = typename remove_rvalue_reference<T>::type;

template <typename Wrapper>
auto createProxy(Wrapper&& w) ->
  Proxy<remove_rvalue_reference_t<decltype((std::forward<Wrapper>(w).t))>> {
    return {std::forward<Wrapper>(w).t};
}