【发布时间】:2017-02-22 00:59:06
【问题描述】:
假设有一个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 };
但是,当尝试从不同类型开始声明另一个 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 构造函数,这样就不必手动将初始化列表的每个成员都转换为双精度?
也许在struct 的声明中使用Point(initializer_list<int> ...) {} 之类的东西?
【问题讨论】:
-
我认为
{ .x=x, .y=y, .z=z }语法来自C,而不是C++,不是吗? -
是的,但是构造函数/重载属于C++,除非我已经过时了。
-
听起来不错。愿意分享如何?
-
@almosnow:C 和 C++ 是不同的语言,没有一个是另一个的超集。即使相同的语法并不意味着相同的语义。这就是为什么这里没有很好地接受两者的双重标记的原因。明确一点:不要为 C++ 问题添加 C 标签,反之亦然!
标签: c++ c++11 struct constructor