C ++ - 有没有办法重载指定的初始值设定项?

时间:2017-02-22 00:59:07

标签: c++ c++11 struct constructor

假设有一个struct类型将用于保存3D空间中Point的坐标。

这可以定义为:

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 };

但是,当尝试从不同类型开始声明另一个Point时:

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 };

有没有办法重载Point构造函数,以便一个人不必手动将初始化列表的每个成员转换为double?

也许在Point(initializer_list<int> ...) {}的声明中使用struct这样的内容?

1 个答案:

答案 0 :(得分:3)

你没有能够重载指定的初始化列表,因为它是not a supported C++ feature但是通过使用构造函数和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};
}