考虑以下计划:
#include <iostream>
struct Test
{
Test(...)
{
std::cout<<"Variadic constructor\n";
}
};
int main()
{
Test t;
t={3,4,5};
}
我认为它是可变构造函数。 C ++标准是否说构造函数可以是可变参数?这种构造函数有什么用?允许可变参数构造函数的基本原理是什么?
答案 0 :(得分:7)
让我们逐一回答您的问题:
我认为它是可变构造函数。
你是对的。
C ++标准是否说构造函数可以是可变参数?
IANALL,但是,我想是的。为什么不?构造函数只是一个(成员)函数。
这种构造函数有什么用?
与任何其他可变参数函数一样 - 传递可变数量的参数。它也有同样的问题,主要是没有 类型 安全和其他任何可变函数一样。例如,假设您需要一个(C)字符串列表,您可以执行类似于查看实时演示here的内容。
#include <iostream>
#include <cstdarg>
struct Test
{
Test(int n,...)
{
va_list va;
va_start(va, n);
for (int i = 0; i < n; ++i) {
char const *s = va_arg(va, char*);
std::cout<<"s=" << s << std::endl;
}
va_end(va);
}
};
int main()
{
Test t{3, "3","4","5"};
}
请记住,为了实现这一点,您至少需要一个非变量的&#34;参数。所以&#34;纯粹的变种&#34;构造函数,就像你展示的那样,在可移植的C ++代码中没有多大意义。对于任何特定平台,即使没有非变量参数,您也可能知道如何访问参数,因此,这可能有效:
Test t={"3","4","5", NULL};
允许可变参数构造函数的基本原理是什么?
&#34;它与C兼容,有人可能会使用它&#34;,我想。如果您了解<cstdarg>
的方式,它可以成为一种有效的工具。当然,对于C ++ 11,您最有可能使用可变参数模板/完美转发和初始化列表。但是,使用C ++ 98,你没有这些工具。