引用与template-template类一起折叠

reference collapsing with template template class

本文关键字:一起 折叠 template-template 引用      更新时间:2023-10-16

为什么引用折叠不适用于

template<typename T, template<typename> class C>
void f(C<T> && x); // x declaration is an rvalue!

如何完善正向,如何避免中常量左值ref、左值ref和右值ref的所有组合过载

template<typename T> // not necessary a template template class here
void f(C<T>, C<T>, C<T>, ..., C<T>)
{
    // do something with T
    // move or copy arguments to a function
}

您将不得不使用某种SFINAE,不幸的是

template<typename T>
struct HasOneTypeParam : std::false_type { };
template<typename T, template<typename> class C>
struct HasOneTypeParam<C<T>> : std::true_type { };
template<typename ...T>
struct SlurpThemAll { typedef int type; };
template<typename ...T, 
  typename SlurpThemAll<
     bool[HasOneTypeParam<typename std::decay<T>::type>::value * 2 - 1]...
     >::type = 0>
void f(T &&... x);

根据你实际想要做的事情,你可以要求所有的std::decay<T>::type都是相同的类型,并使用更多的SFINAE技巧。