5

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

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

我希望这可以接受左值和右值,但仅适用于右值。折叠规则“T& && = T&”不适用于这种情况?

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

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

谢谢

4

1 回答 1

3

可以推断为引用类型的不同typename Ttemplate<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, "!");
}
于 2012-11-30T17:13:19.450 回答