dod*_*ndi 5 c++ templates rvalue-reference template-templates c++11
我遇到了模板模板和参数扣除的问题.这是代码:
template<typename U, template<typename> class T>
void test(T<U>&& t)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以接受左值和左值,但只适用于右值.折叠规则"T &&& = T&"在这种情况下不适用?
当然,我也可以声明左值引用函数,但是使代码的可读性降低.
如果你问我为什么需要这个就是使用static_assert来检查T是否是一个特定的类.如果有一种更简单的方法,我会很乐意改变我的代码,但我想知道模板模板是否可以这种方式使用.
谢谢
与 不同typename T, 可以被推导为引用类型,但template<typename> class T只能被推导为类模板,因此T<U>总是被推导为对象类型。
您可以编写模板化的函数,T然后在以下位置解压模板类型static_assert:
template<typename T> struct is_particular_class: std::false_type {};
template<typename U> struct is_particular_class<ParticularClass<U>>: std::true_type {};
template<typename T> void test(T &&) {
static_assert(is_particular_class<std::remove_reference<T>::type>::value, "!");
}
Run Code Online (Sandbox Code Playgroud)