仅进一步传递参数(不单独访问)时模板化和非模板化可变参数函数之间的编译差异

问题描述 投票:0回答:1

我试图理解在C ++中使用模板化与非模板化可变参数函数之间的编译(特别是编译时间)有什么区别,在特殊情况下,当传递的可变参数只需要进一步传递给另一个功能 - 不能单独访问。

例如,假设我们有这个测试用例类:

class ClassA 
{
    int _x = 0;
    double _y= 0.0;
    const char* _z = "";

    public:
    ClassA(int x, double y, const char* z) { _x=x; _y=y; _z=z;}

    void get() { printf("%i %f %s\n", _x, _y, _z); }
};

接下来,我们有一个函数的非模板化版本和模板化版本:

void fooVar(const auto & ...args)
{
    ClassA instance = ClassA(args...);
    instance.get();
}

template <typename... Args>
void fooTemp(const Args & ...args)
{
    ClassA instance = ClassA(args...);
    instance.get();
}

两者都按预期工作:

int main
{
    fooVar(10, 3.5, "example");
    fooTemp(10, 3.5, "example");
    return 0;
}

我试图了解编译器对待每个函数的不同,以及当一个人有许多并且可能更复杂的函数时,编译时性能的优缺点是什么 - 当传递的可变参数不扩展为单独访问但而是进一步传递给其他一些函数。

c++ performance compilation c++20 variadic-templates
1个回答
0
投票
void fooVar(const auto & ...args)

在函数参数列表中使用占位符

auto
使该函数成为 缩写函数模板,这使得它相当于为每次出现
auto
使用不同类型模板参数(可能是一个包)的函数模板。 IE。在这种情况下,它完全等同于

template <typename... Args>
void fooVar(const Args & ...args)

两者都是带有模板参数包和函数参数包的可变模板可变参数函数也不是完全不同的东西。可变参数函数是一个 C 概念,与模板无关。例如

printf
是一个可变参数函数。它们通常仅在 C++ 中用于与 C 交互。

© www.soinside.com 2019 - 2024. All rights reserved.