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

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

问题描述:

假设我们有一些可变参数模板,并且需要以不同的方式处理std::reference_wrapper参数。 我们如何实现这一目标?如何在编译时检测C++中的std :: reference_wrapper

+1

你为什么要这么做? – OMGtechy

+2

您想以何种方式对待他们?打印'os &&''作为'T&'在调用'.get()'的时候? – Yakk

你可以做一个特征判断一个类型是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