Перегрузка opAssign () похожа на перегрузку оператора присваивания в C ++. Это для присвоения самому объекту, а не одному из его членов. Это действительно не собирается делать то, что вы хотите. Я считаю, что самое близкое, что вы собираетесь получить, это свойства:
class Gerbil
{
public:
@property int id()
{
return _id;
}
@property id(int newID)
{
//... Do whatever interception you want.
_id = newID;
}
@property float x()
{
return _x;
}
@property x(float newX)
{
//... Do whatever interception you want.
_x = newX;
}
@property float y()
{
return _y;
}
@property y(float newY)
{
//... Do whatever interception you want.
_y = newY;
}
@property float z()
{
return _z;
}
@property z(float newZ)
{
//... Do whatever interception zou want.
_z = newZ;
}
private:
int _id;
float _x, _y, _z;
}
@property
включает синтаксис свойства, так что вы можете использовать функцию, как если бы она была переменной. Таким образом,
//...
auto copyOfGerbilX = gerbil.x; //translates to gerbil.x()
gerbil.x = 9.0; //translates to gerbile.x(9.0)
//...
теперь допустимо, хотя x
является функцией, а не переменной. Вы можете вставить любой специальный код обработки, который вы хотите в функции. А поскольку синтаксис, используемый для доступа к переменным, такой же, как если бы они были открытыми переменными-членами, вы можете свободно реорганизовать свой код, чтобы переключаться между тем, чтобы они были свойствами или открытыми переменными-членами в определении класса (при условии, что вы не пытались это сделать). что-то вроде взятия их адреса, поскольку для переменной это не означает то же самое, что и функция).
Однако, если вы ищете общий способ не выполнять все эти функции самостоятельно, для этого нет прямой конструкции. Я полагаю, что вы могли бы сделать это с помощью отражения во время компиляции и строковых или шаблонных смесей, которые будут смотреть на список ваших переменных и затем генерировать каждую из функций свойств для вас. Однако тогда дополнительный код обработки должен быть практически одинаковым для каждой функции, и вы должны быть осторожны, чтобы сгенерированный код был действительно тем, что вы хотели. Я уверен, что это выполнимо, но мне пришлось бы немного поработать над этой проблемой, чтобы найти работоспособное решение.
Чтобы сгенерировать такой код, вам нужно взглянуть на __ traits и std.traits для отражения во время компиляции и на шаблонных миксинов и string mixins для генерации кода. Я бы дважды подумал о генерации такого кода, а не писать его вручную. Это должно быть вполне выполнимо, но это не обязательно будет легко, отладка может быть интересной, и если вы собираетесь быть достаточно хорошими с D-шаблонами и миксинами, чтобы сделать это правильно.
Но, по сути, вам нужно использовать функции @property, чтобы вы могли добавить свой код обработчика, а затем, возможно, использовать отражение во время компиляции вместе с миксинами для генерации кода для вас, но генерация такого кода довольно продвинутая техника, так что вы можете подождать, чтобы попробовать ее, пока не разберетесь с D.