2016-11-04 4 views
4

Допустим, у нас есть несколько вариационных шаблонов и нужно обрабатывать параметры std::reference_wrapper по-разному. Как мы можем достичь этого?Как определить std :: reference_wrapper в C++ во время компиляции

+1

Почему вы должны сделать это? – OMGtechy

+2

Каким образом вы хотите относиться к ним по-другому? Печать 'os <<" chicken "' когда вы печатаете их, используя 'os << t' на других типах? Обработайте 'reference_wrapper &&' как 'T &' при вызове '.get()' на них? – Yakk

ответ

9

Вы можете сделать черта сказать, если тип является 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

Смежные вопросы