问题描述
template<class... Args>
void foo(Args&&... args)
{
boo<std::decay_t<Args>...>(std::forward<Args>(args)...);
}
int value = 123;
const int& cr_value = value;
foo(value );
foo(std::cref(value ));
在第一种情况下我调用 boo<int>
在第二种情况下调用 boo<std::const_reference_wrapper<int>>
。
有没有办法自动“取消引用”reference_wrapper 而无需显式使用 get
函数对于包中的每个参数?
这样做的原因是我想在第二种情况下调用 boo<const int&>
,而不是 boo<std::const_reference_wrapper<int>>
解决方法
您可能会执行以下操作:
template <typename T> struct unwrap {
using type = T;
};
template <typename T> struct unwrap<std::reference_wrapper<T>> {
using type = T&;
};
template <typename T> using unwrap_t = typename unwrap<T>::type;
template<class... Args>
void foo(Args&&... args)
{
boo<unwrap_t<std::decay_t<Args>>...>(std::forward<Args>(args)...);
}
Demo。