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.