C++中可变参数构造函数的用途是什么?
What is the use of variadic constructor in C++?
考虑以下程序:
#include <iostream>
struct Test
{
Test(...)
{
std::cout<<"Variadic constructor\n";
}
};
int main()
{
Test t;
t={3,4,5};
}
我认为它是可变构造函数。 C++ 标准是否说构造函数可以是可变的?这样的构造函数有什么用?允许可变构造函数的理由是什么?
让我们试着一一回答您的问题:
I think it is variadic constructor.
你是对的。
Does the C++ standard says that constructor can be variadic?
IANALL,但是,我认为是的。为什么不?构造函数只是一个(成员)函数。
What is the use of such constructor?
与任何其他可变参数函数一样 - 传递可变数量的参数。它也有同样的问题,主要是 no type safety 与任何其他可变参数函数一样。例如,假设您需要一个 (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"};
}
请记住,要使其正常工作,您至少需要一个 "non-variadic" 参数。所以 "pure variadic" 构造函数,就像你展示的那样,在可移植的 C++ 代码中没有多大意义。对于任何特定平台,您可能知道如何在没有非可变参数的情况下访问参数,因此,这可能有效:
Test t={"3","4","5", NULL};
What is the rationale for allowing variadic constructor?
"It's C compatible and someone might have a use of it",我猜。如果您熟悉 <cstdarg>
,它会是一个有效的工具。当然,对于 C++11,您很可能应该改用可变参数模板/完美转发和初始化列表。但是,对于 C++98,您没有这些工具。
考虑以下程序:
#include <iostream>
struct Test
{
Test(...)
{
std::cout<<"Variadic constructor\n";
}
};
int main()
{
Test t;
t={3,4,5};
}
我认为它是可变构造函数。 C++ 标准是否说构造函数可以是可变的?这样的构造函数有什么用?允许可变构造函数的理由是什么?
让我们试着一一回答您的问题:
I think it is variadic constructor.
你是对的。
Does the C++ standard says that constructor can be variadic?
IANALL,但是,我认为是的。为什么不?构造函数只是一个(成员)函数。
What is the use of such constructor?
与任何其他可变参数函数一样 - 传递可变数量的参数。它也有同样的问题,主要是 no type safety 与任何其他可变参数函数一样。例如,假设您需要一个 (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"};
}
请记住,要使其正常工作,您至少需要一个 "non-variadic" 参数。所以 "pure variadic" 构造函数,就像你展示的那样,在可移植的 C++ 代码中没有多大意义。对于任何特定平台,您可能知道如何在没有非可变参数的情况下访问参数,因此,这可能有效:
Test t={"3","4","5", NULL};
What is the rationale for allowing variadic constructor?
"It's C compatible and someone might have a use of it",我猜。如果您熟悉 <cstdarg>
,它会是一个有效的工具。当然,对于 C++11,您很可能应该改用可变参数模板/完美转发和初始化列表。但是,对于 C++98,您没有这些工具。