3

为什么参考折叠不适用于

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

我怎样才能完美向前,怎样才能避免重载 const lvalue ref、lvalue ref、rvalue 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
}
4

1 回答 1

2

不幸的是,您将需要使用某种 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 hacks。

于 2013-07-15T20:05:16.970 回答