【问题标题】:What is the use of variadic constructor in C++?C ++中可变参数构造函数的用途是什么?
【发布时间】:2015-10-13 16:42:00
【问题描述】:

考虑以下程序:

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

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

【问题讨论】:

  • 这样就不必编写多个构造函数了。这个不是很有用,顺便说一下,它没有提供任何关于参数实际是什么的信息。
  • 第一个问题:函数可以是可变参数,构造函数是函数。为什么不能是可变参数?
  • @MrLister:如果你写一个答案,用一个例子来解释它的用处会更好。
  • 现在我们有了可变参数模板,可变参数方法几乎没用了。缺乏类型安全等等。
  • Pravasi Meet,但正如@lisyarus 所说,可变参数构造函数与任何其他可变参数函数一样有用。您真的在询问可变参数函数的用途吗?

标签: c++ constructor variadic-functions variadic


【解决方案1】:

让我们尝试一一回答您的问题:

我认为它是可变参数构造函数。

你是对的。

C++ 标准是否规定构造函数可以是可变参数?

IANALL,但是,我想是的。为什么不?构造函数只是一个(成员)函数。

这样的构造函数有什么用?

与任何其他可变参数函数一样 - 传递可变数量的参数。它也有同样的问题,主要是 no type safety 与任何其他可变参数函数一样。例如,假设您需要一个 (C) 字符串列表,您可以执行类似 See live demo 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"};
}

请记住,要使其正常工作,您至少需要一个“非可变”参数。因此,像您展示的那样,“纯可变参数”构造函数在可移植 C++ 代码中没有多大意义。对于任何特定平台,即使没有非可变参数,您也可能知道如何访问参数,因此,这可能有效:

     Test t={"3","4","5", NULL};

允许可变参数构造函数的基本原理是什么?

“它是 C 兼容的,有人可能会使用它”,我猜。如果您熟悉&lt;cstdarg&gt;,它可能是一个有效的工具。当然,对于 C++11,您很可能应该使用可变参数模板/完美的转发和初始化列表。但是,对于 C++98,您没有这些工具。

【讨论】:

  • 精彩的答案和很好的解释。
  • 您的代码包含编译错误。 (见现场演示 ideone.com/VkQmwx )变量 va 应该是 va_list 而不是 va_arg。 (在此处查看工作代码:ideone.com/nS2Kuw
  • @PravasiMeet 谢谢,我当然应该检查一下,但它更像是一个插图而不是演示,这就是它滑倒的原因......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2016-01-02
  • 2011-09-05
  • 1970-01-01
相关资源
最近更新 更多