c++ - Template模板函数及参数推导

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

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

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

我希望它能接受左值和右值,但只适用于右值。折叠规则“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, "!");
}

关于c++ - Template模板函数及参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649789/

相关文章:

c++ - 如何在 C++ 中通过另一个索引数组重新排列一个数组

c++ - Python逐行从子进程捕获stdout

c++ - 在QT5中,如何在子菜单项的点击事件上打开新窗口?

c++ - 在模板中重载 < 运算符

c++11 - AX_CXX_COMPILE_STDCXX_11 不起作用 : syntax error near unexpected token `,'

c++ - std::is_convertible 的可变参数版本?

c++ - 使用宏来缩写长篇大论的 boost 模板名称是一种不好的做法吗?

asp.net-mvc - ASP.NET MVC 3 中的条件布局

c++ - 标准容器中的抽象类

c++ - 混合使用 C 和 C++ 时使用 nullptr 而不是 NULL