模板模板功能和参数扣除

时间:2012-11-30 17:09:43

标签: c++ templates c++11 rvalue-reference template-templates

我遇到了模板模板和参数扣除的问题。这是代码:

template<typename U, template<typename> class T>
void test(T<U>&& t)
{
  ...
}

我希望这可以接受左值和左值,但只适用于右值。崩溃规则“T&amp;&amp;&amp; = T&amp;”在这种情况下不适用?

当然,我也可以声明左值引用函数,但是使代码的可读性降低。

如果你问为什么我需要这个是使用static_assert来检查 T 是否是一个特定的类。如果有一种更简单的方法,我会很乐意改变我的代码,但我想知道模板模板是否可以这种方式使用。

由于

1 个答案:

答案 0 :(得分:3)

与可以推断为引用类型的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, "!");
}