使用 Args 对 reference_wrappers 进行类型推导

问题描述

我有一个模板函数

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 而无需显式使用 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