reference_wrappers 与 Args 的类型推导
Type deduction of reference_wrappers with Args
我有一个模板函数:
template<class... Args>
void foo(Args&&... args)
{
boo<std::decay_t<Args>...>(std::forward<Args>(args)...);
}
现在我要做的是像这样多次调用 foo 函数:
int value = 123;
const int& cr_value = value;
foo(value );
foo(std::cref(value ));
在第一种情况下我调用 boo<int>
在第二种情况下调用 boo<std::const_reference_wrapper<int>>
。
有没有办法自动“取消引用”reference_wrapper,而无需为 pack 中的每个参数显式使用 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.
我有一个模板函数:
template<class... Args>
void foo(Args&&... args)
{
boo<std::decay_t<Args>...>(std::forward<Args>(args)...);
}
现在我要做的是像这样多次调用 foo 函数:
int value = 123;
const int& cr_value = value;
foo(value );
foo(std::cref(value ));
在第一种情况下我调用 boo<int>
在第二种情况下调用 boo<std::const_reference_wrapper<int>>
。
有没有办法自动“取消引用”reference_wrapper,而无需为 pack 中的每个参数显式使用 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.