繁体   English   中英

如何在编译时检测C ++中的std :: reference_wrapper

[英]How to detect std::reference_wrapper in C++ at compile time

假设我们有一些可变参数模板,需要以不同方式处理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)...
    };
}

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM