c – 将参数包解压缩到另一个模板声明中意味着什么?

前端之家收集整理的这篇文章主要介绍了c – 将参数包解压缩到另一个模板声明中意味着什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不明白应该如何使用以下功能.当我调用A :: f时我可以省略模板参数,但我不明白为什么.
  1. template <typename... Args>
  2. struct A
  3. {
  4. template <Args...>
  5. void f() {}
  6. };
  7.  
  8. int main()
  9. {
  10. A<int,bool> a;
  11. a.f();
  12. }

具体而言,模板< Args ...>是什么?是什么意思,为什么我可以将模板参数从函数调用删除到f?

解决方法

template< typename ... Args>是一个可变参数模板.这意味着,您可以指定任意数量的模板类型参数,但我想您已经知道了.

每当Args …出现在模板代码中时,它将被解压缩(“扩展”)到实例化的类型.在您的示例中,这是int,bool.因此,当完全展开时,您的类将变为以下定义:

  1. struct A<int,bool>
  2. {
  3. template <int,bool>
  4. void f() {}
  5. };

这意味着,A< int,bool> :: f()再次被模板化(参数被解压缩到另一个模板声明中,就像你所说的那样),但这次使用非类型模板参数,类型为int和bool(它们’匿名),所以你可以像这样实例化f():

  1. a.f<1,true>();

不幸的是,g似乎有一个bug和won’t accept这段代码,而它是accepts你的代码.

clang接受这两个代码.我希望在你的代码中,clang不关心int和bool模板参数是否被省略,但是当它们被指定时它不会抱怨(与g相反).

用法示例:

如果要使用指定的值,则它们不能是匿名的(显然).例如,您可以在f()中提供一个格式字符串,用于“printf”模板值,如下所示:

  1. template <Args ...values>
  2. void f(const char *fmt) {
  3. std::printf(fmt,values...);
  4. }

然后,以下代码

  1. A<int> a;
  2. a.f<42>("The answer is %d!\n");

将打印:

  1. The answer is 42!

但是,使用上面的语法(Args …扩展为匿名非类型模板参数),模板参数基本上是无用的.

没有指定值,它仍然编译(这让我感到惊讶!)并打印一个未初始化的int值.

猜你在找的C&C++相关文章