C - 是否有一种方法可以超载指定的初始化器

C++ - Is there a way to overload designated initializers?

本文关键字:超载 初始化 方法 一种 是否      更新时间:2023-10-16

假设有一种struct类型将用于将点的坐标用于3D空间。

这可以像:

一样定义
struct Point { double x, y, z; };

使用double值,因为我们想尽可能精确。

可以使用指定的复合文字来声明此struct的实例,例如:

double x = 0.0;
double y = 0.0;
double z = 0.0;
...
Point p = (struct Point){ .x=x, .y=y, .z=z };

但是,在尝试从不同类型开始声明另一点时:

int x = 0;
int y = 0;
int z = 0;
...
Point p = (struct Point){ .x=x, .y=y, .z=z };

编译器会丢下错误,因为它找不到合适的构造函数。如果有人这样做:

Point p = (struct Point){ .x=(double)x, .y=(double)y, .z=(double)z };

有没有办法超载点构造函数,因此不必手动

也许在struct的声明中使用诸如Point(initializer_list<int> ...) {}之类的东西?

您不是为了使指定的初始化程序列表超载,因为这不是一个支持的C 功能,而是使用constructor和C 11的统一初始化,您可以非常接近你想要什么。如果我们有

struct Point { 
    Point (double x, double y, double z) : x(x), y(y), z(z) {}
    double x, y, z; 
};

然后我们可以像

一样使用它
int main() {
    double x = 0.0;
    double y = 0.0;
    double z = 0.0;
    Point p{x, y, z};
    Point i{1, 2, 3};
}