2017-02-22 36 views
-2

Предположим, что существует тип struct, который будет использоваться для хранения координат точки в 3D-пространстве.C++ - Есть ли способ перегрузить назначенные инициализаторы?

Это может быть определено как:

struct Point { double x, y, z; }; 

Making использование 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 }; 

Есть ли способ перегрузки конструктора точки, так что один не должен вручную CAST каждого члена списка инициализации удваивать?

Возможно, используя что-то вроде Point(initializer_list<int> ...) {} в заявлении struct?

+3

Я думаю, что '{.x = х, .y = у, .z = г}' Синтаксис из C, не C++, не так ли? – yeputons

+0

Да, но конструкторы/перегрузка относятся к C++, если я не устарел. – almosnow

+0

Я бы просто создал 'std :: initializer_list ' конструктор. – NathanOliver

ответ

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

Надеясь, что однажды эта функция пробивается в C++ ... – almosnow

+1

@almosnow: Это уже [проголосовали за C++ 20, видимо] (https: //botondballo.wordpress.ком/2016/07/06/трип-отчет-с-стандартов конференц-в-Оулу-июня-2016 /). С некоторыми ограничениями относительно C. –