c++使用va_arg调用父类(super class)构造函数

标签 c++ constructor variadic-functions

我有一个基类,其中包含一个带有可变参数列表的构造函数:

class Super {
public:
    Super(int num, ...);
...
}

现在,在我的子类构造函数中,我需要以某种方式调用这个父类(super class)构造函数,但我该怎么做呢?通常的事情自然是行不通的:

class Sub {
public:
    Sub(int num, ...) : Super(???) { ... }
...
}

那么我应该输入什么而不是 ???

我确实有另一个接受 vector 的构造函数,但有这样一个构造函数是客户的直接要求。

最佳答案

与任何变量函数一样,也始终提供列表版本:

void foo(int a, ...) { va_list ap; va_start(ap, a); vfoo(a, ap); va_end(ap); }

void vfoo(int a, va_list ap) { /* actual implementation */ }

这里也一样:

#include <cstdarg>

struct Super
{
    Super(int num, ...) : Super(num, (va_start(ap_, num), ap_)) { va_end(ap_); }
    Super(int num, va_list ap);

private:
    va_list ap_;
};

您的派生类将执行相同的 vapacking 体操,然后使用 super 构造函数的列表形式。

如果仅出于构造目的而拥有一个数据成员让您感到不安,并且您的类在其他方面是可复制或可移动的,您也可以放弃变量构造函数,而是使用一个命名的静态成员函数来进行包包装。

关于c++使用va_arg调用父类(super class)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31245415/

相关文章:

c++ - 如何仅使用标准库将 C++ 对象写入文件

c++ - 使用 std::function 和 std::bind 来存储回调和处理对象删除。

c++ - 如何避免在父构造函数更改时更改每个子构造函数

c - 卡在 myPrintf 和 va_arg 列表中

c++ - 是否可以为具有可变参数的宏定义 c++ 包装函数?

matlab - 跨参数函数参数验证不适用于(重复)参数吗?

android - 在代码中包含 C++ 预处理器指令 - Android NDK

c++ - 使用列表对象内部对象的派生函数

c++ - 复制构造函数不是深度复制,错误返回数组为空

PHP 构造函数和静态函数