在C ++中使用可变参数构造函数有什么用?

时间:2015-10-13 16:42:01

标签: c++ constructor variadic-functions variadic

考虑以下计划:

#include <iostream>
struct Test
{
    Test(...)
    {
        std::cout<<"Variadic constructor\n";
    }
};
int main()
{
    Test t;
    t={3,4,5};
}

我认为它是可变构造函数。 C ++标准是否说构造函数可以是可变参数?这种构造函数有什么用?允许可变参数构造函数的基本原理是什么?

1 个答案:

答案 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,你没有这些工具。