提问人:Louis15 提问时间:10/20/2023 最后编辑:user17732522Louis15 更新时间:10/20/2023 访问量:71
模板化和非模板化可变参数函数之间的编译差异,当参数仅进一步传递(不单独访问)时 [重复]
Compilation differences between templated and non-templated variadic functions when arguments are only further passed (not accessed individually) [duplicate]
问:
我试图了解在 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;
}
我试图了解编译器对待每个函数的不同之处,以及当一个函数具有许多可能更复杂的函数时,编译时性能的优缺点是什么 - 当传递的可变参数没有被扩展为单独访问时,而只是进一步传递给一些其他函数。
答:
1赞
user17732522
10/20/2023
#1
void fooVar(const auto & ...args)
在函数参数列表中使用占位符会使函数成为缩写的函数模板,这使其等效于函数模板,该函数模板对每次出现的 .即在这种情况下,它完全等价于auto
auto
template <typename... Args>
void fooVar(const Args & ...args)
两者都是带有模板参数包和函数参数包的可变参数模板。变参数函数也不是完全不同的东西。可变参数函数是一个 C 概念,与模板无关。例如,是可变参数函数。它们通常只在 C++ 中用于与 C 接口。printf
上一个:将模板参数列表替换为可变参数
评论