可以说我们有一些可变参数模板,需要区别对待std::reference_wrapper参数。
我们如何实现这一目标?

最佳答案

您可以使用特征来判断类型是否为reference_wrapper

template<typename T>
struct is_reference_wrapper : false_type {};

template<typename T>
struct is_reference_wrapper<reference_wrapper<T>> : true_type{};

然后,您可以使用它来消除歧义:
template<typename T>
void do_stuff(T&& t, false_type)
{
    cout << "Normal: " << t << endl;
}

template<typename T>
void do_stuff(T&& ref, true_type)
{
    cout << "Ref: " << ref.get() << endl;
}

template<typename... Ts>
void foo(Ts&&... ts)
{
    [[maybe_unused]] int arr[] = {
        (do_stuff(forward<Ts>(ts), is_reference_wrapper<decay_t<Ts>>{}), 0)...
    };
}

demo

关于c++ - 如何在编译时检测C++中的std::reference_wrapper,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40430692/

10-14 08:00