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};
}