在模板模板参数的情况下,是否可以使void foo
采用通用引用而不是右值引用,如下面的代码所示?
#include <iostream>
#include <string>
using namespace std;
template <int I>
struct s
{
string str;
};
template <template<int> class T, int U>
void foo(T<U>&& param)
{
cout << param.str << endl;
}
int main()
{
s<5> thing;
foo( thing );
}
我得到following error:
error: cannot bind 's<5>' lvalue to 's<5>&&'
答案 0 :(得分:2)
不,通用引用依赖于推导为左值引用的模板参数。 T
中的T<U>&&
不能是左值参考,因此无效。
可以使用T&&
,并使用SFINAE要求它匹配某些T<U>
。
template <template<int> class T, int U>
void foo_helper(const volatile T<U>&);
template <template<int> class T, int U>
void foo_helper(const volatile T<U>&&);
template <typename T, typename = decltype(foo_helper(std::declval<T>()))>
void foo(T&& param)
{
cout << param.str << endl;
}
如果需要,如果foo
意图直接使用T
或U
,您还可以提供帮助类型特征。