C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 将参数包解压缩到另一个模板声明中意味着什么?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我不明白应该如何使用以下功能.当我调用A :: f时我@R_675_10837@模板参数,但我不明白为什么.
template <typename... Args>
struct A
{
    template <Args...>
    void f() {}
};

int main()
{
    A<int,bool> a;
    a.f();
}

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

解决方法

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

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

struct A<int,bool>
{
    template <int,bool>
    void f() {}
};

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

a.f<1,true>();

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

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

用法例:

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

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

然后,以下代码

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

将打印:

The answer is 42!

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

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

大佬总结

以上是大佬教程为你收集整理的c – 将参数包解压缩到另一个模板声明中意味着什么?全部内容,希望文章能够帮你解决c – 将参数包解压缩到另一个模板声明中意味着什么?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。