c++ 使用 va_arg 调用超类构造函数
c++ calling superclass constructor with va_arg
我有一个基础 class,其中包括一个带有可变参数列表的构造函数:
class Super {
public:
Super(int num, ...);
...
}
现在,在我的 subclass 构造函数中,我需要以某种方式调用这个 superclass 构造函数,但我该怎么做呢?平常的事,自然不行:
class Sub {
public:
Sub(int num, ...) : Super(???) { ... }
...
}
那么我要输入什么来代替 ???
我确实有另一个接受向量的构造函数,但拥有这样的构造函数是客户的直接要求。
与任何可变函数一样,也始终提供列表版本:
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_;
};
您派生的 classes 将执行相同的 vapacking 体操,然后使用超级构造函数的列表形式。
如果有一个数据成员只是为了构造的目的让你心烦意乱,而你的 class 在其他方面是可复制或可移动的,你也可以放弃变量构造函数,取而代之的是有一个命名的静态成员函数来执行包装。
我有一个基础 class,其中包括一个带有可变参数列表的构造函数:
class Super {
public:
Super(int num, ...);
...
}
现在,在我的 subclass 构造函数中,我需要以某种方式调用这个 superclass 构造函数,但我该怎么做呢?平常的事,自然不行:
class Sub {
public:
Sub(int num, ...) : Super(???) { ... }
...
}
那么我要输入什么来代替 ???
我确实有另一个接受向量的构造函数,但拥有这样的构造函数是客户的直接要求。
与任何可变函数一样,也始终提供列表版本:
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_;
};
您派生的 classes 将执行相同的 vapacking 体操,然后使用超级构造函数的列表形式。
如果有一个数据成员只是为了构造的目的让你心烦意乱,而你的 class 在其他方面是可复制或可移动的,你也可以放弃变量构造函数,取而代之的是有一个命名的静态成员函数来执行包装。