В винде есть структура LARGE_INTEGER, представляющая 64-разрядные значения. Она неудобна тем, что для 64-разрядных операций нужно специально указывать поле .QuadPart, и тем, что это поле знаковое — нельзя присвоить ему беззнаковое значение без преобразования. Не смертельно, но получается уж больно громоздко.
А оператор присваивания непременно должен быть членом класса. Если порождать класс от _LARGE_INTEGER, то придется вводить преобразования к дочернему классу — одни громоздкие построения заменяются на другие.
Может, есть способ присобачить оператор присваивания минимальными усилиями?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Можно ли присобачить оператор присваивания к структуре?
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>А вы присваиваете один LARGE_INTEGER другому или как? Просто, зачем вам вообще переопределять оператор?
Я LARGE_INTEGER использую только через поле QuadPart — простое 64-разрядное значение. Поэтому хотелось бы иметь оператор, позволяющий просто присваивать значение переменной типа LARGE_INTEGER, не залезая в поле, а также присваивать беззнаковые значения с автоматическим преобразованием. А глобально отключать предупреждения на несоответствие знаковости/беззнаковости типа не хочу — они нужны.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Евгений Музыченко, Вы писали:
L_L>>А вы присваиваете один LARGE_INTEGER другому или как? Просто, зачем вам вообще переопределять оператор?
ЕМ>Я LARGE_INTEGER использую только через поле QuadPart — простое 64-разрядное значение. Поэтому хотелось бы иметь оператор, позволяющий просто присваивать значение переменной типа LARGE_INTEGER, не залезая в поле, а также присваивать беззнаковые значения с автоматическим преобразованием. А глобально отключать предупреждения на несоответствие знаковости/беззнаковости типа не хочу — они нужны.
а можешь пример кода привести, что хотелось бы получить в итоге?
Re[3]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>А вы присваиваете один LARGE_INTEGER другому или как? Просто, зачем вам вообще переопределять оператор?
ЕМ>Я LARGE_INTEGER использую только через поле QuadPart — простое 64-разрядное значение. Поэтому хотелось бы иметь оператор, позволяющий просто присваивать значение переменной типа LARGE_INTEGER, не залезая в поле, а также присваивать беззнаковые значения с автоматическим преобразованием. А глобально отключать предупреждения на несоответствие знаковости/беззнаковости типа не хочу — они нужны.
а обязательно использовать именно LARGE_INTEGER? можно взять тот же boost::uint64_t, например
Re[4]: Можно ли присобачить оператор присваивания к структур
Функции KeXxx, понятное дело, не мои — виндовые, и структуры нужно тоже передать винде. Для внутренних нужд я пользуюсь UINT64, здесь никаких проблем нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Евгений Музыченко, Вы писали:
NB>>а можешь пример кода привести, что хотелось бы получить в итоге?
ЕМ>Хм, здесь разве можно что-то понять превратно?
ЕМ>
Здравствуйте, night beast, Вы писали:
NB>возьмем за начальное приближение такой код:
Так понятно, что через промежуточные классы/переменные все решается элементарно. Но уж если браться — хочется сделать элегантно, а тут придется либо вводить переменные типа integer, либо явные преобразования.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Евгений Музыченко, Вы писали:
NB>>возьмем за начальное приближение такой код:
ЕМ>Так понятно, что через промежуточные классы/переменные все решается элементарно. Но уж если браться — хочется сделать элегантно, а тут придется либо вводить переменные типа integer, либо явные преобразования.
да.
можешь, конечно, переопределить какой нибудь operator << но operator = никак получится.
Re[6]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Alexey F, Вы писали:
AF>Может, как вариант, просто ввести внешнюю ф-цию?:
В большом проекте функция set не годится — ее нужно будет как-то длинно и понятно обозвать, и из текста не будет очевиден смысл действия. Хочется именно присобачить оператор присваивания прямо к существующему классу LARGE_INTEGER. И на кой стандартом это запрещено?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В большом проекте функция set не годится — ее нужно будет как-то длинно и понятно обозвать, и из текста не будет очевиден смысл действия. Хочется именно присобачить оператор присваивания прямо к существующему классу LARGE_INTEGER. И на кой стандартом это запрещено?
set, assign — в принципе, не такие и плохие имена для свободной ф-ции или семейства свободных ф-ций, устанавливающих значение. Может, подошли бы setUnsigned или assignUnsigned, т.к. нет точного соответствия между типом QuadPart (LONGLONG) и вторым их аргументом (UINT64) (с другой стороны, перегруженные ф-ции для того и делаются, чтобы избавиться от таких имён).
Можно оставить явный operator= в коде, но модифицировав левую часть присваивания:
Здравствуйте, Евгений Музыченко, Вы писали:
NB>>можешь, конечно, переопределить какой нибудь operator << но operator = никак получится.
ЕМ>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.
не знаю. возможно сочли не целесообразным.
Re[10]: Можно ли присобачить оператор присваивания к структу
Здравствуйте, night beast, Вы писали:
ЕМ>>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.
NB>не знаю. возможно сочли не целесообразным.
Когда считают нецелесообразным — просто не принимают специальных мер. А здесь из множества всех глобальных бинарных операций присваивания специально выделены и запрещены.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.
Чтоб ты не переопределил присваивание для интов и других встроенных типов. То же самое касается и ->, [] и что там еще было?
Может еще потому, что operator= генерится компилятором, если не реализуешь свой. Может каким-то образом это облегчает задачу компиляторописателям.
Re[10]: Можно ли присобачить оператор присваивания к структу
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.
AD>Чтоб ты не переопределил присваивание для интов и других встроенных типов. То же самое касается и ->, [] и что там еще было? AD>Может еще потому, что operator= генерится компилятором, если не реализуешь свой. Может каким-то образом это облегчает задачу компиляторописателям.
И еще сигнатуру int зафиксировать, чтоб не получались финты вроде этого:
struct test
{
test() {}
test(int i) {}
};
test operator = (test a, test b);
void foo()
{
test a;
1 = a;
}
Или такие:
struct test
{
void set(const test &r) { *this = r; }
}
test& operator = (test &l, const test& r){}
void foo()
{
test a, b;
a.set(b); // какой оператор вызовется?
}
Re[10]: Можно ли присобачить оператор присваивания к структу
Здравствуйте, Евгений Музыченко, Вы писали: ЕМ>Здравствуйте, night beast, Вы писали: NB>>можешь, конечно, переопределить какой нибудь operator << но operator = никак получится. ЕМ>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.
Потому, что оператор присваивания неявно генерируется компилятором, если он не определён.