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