包装类的完美转发
Perfect forwarding for wrapper classes
例如,我有一个包装类:
template <typename T>
struct Wrapper {
T t;
};
某些代理类使用T
:执行某些操作
template <typename T>
struct Proxy {
T t;
void operator()() const {/* .... */}
}
为了方便起见,现在有一种方法可以创建代理,我已经为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)};}
当然,这只是我想使用的精简代码,但为了让所有东西都更可读,我想使用一些完美的转发魔法,减少代码,让所有东西更可读:
template <typename Wrapper>
Proxy</* ??? */> createProxy(Wrapper &&w) { /* ??? */ }
所以问题是,我如何推导l值或r值类型的成员的l值或r-值类型?
std::forward<Wrapper>(w).t
与w
具有相同的值类别,因此您只需要返回一个Proxy
,其中&&
从decltype((std::forward<Wrapper>(w).t))
:中剥离
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};
}
在Coliru演示
相关文章:
- 将函数参数完美转发到函数指针:按值传递呢?
- C++20理念:要求表达和完美转发
- 完美的转发和构造函数
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 返回值的完美转发?
- 使用衰减与完美转发
- 可变参数模板:将整数参数完美转发到 lambda
- 完美转发C++重载和模板化函子及其参数
- 在完美转发中需要衰减
- C++完美转发:如何避免悬空引用
- 完美的对象转发阵列
- 无法理解一段具有完美转发和省略号的C++代码
- 在编写包装现有函数并检查错误的模板函数时,如何使用完美转发?
- 完美转发可变参数模板模板
- 在完美转发函数中公开参数类型,避免代码重复
- 完美的转发构造函数和已删除的构造函数
- 完美的转发功能推断出冲突错误
- 使用完美转发的模板转换构造函数
- 完美转发使用结构化绑定声明的变量
- 完美转发常量参数以进行持续评估