В винде есть структура 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++, поэтому очевидной причины для такого запрета не улавливаю.
Потому, что оператор присваивания неявно генерируется компилятором, если он не определён.
Re[10]: Можно ли присобачить оператор присваивания к структу
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>А оператор присваивания непременно должен быть членом класса. Если порождать класс от _LARGE_INTEGER, то придется вводить преобразования к дочернему классу — одни громоздкие построения заменяются на другие.
Я сделал структуру-обертку над FILETIME, и никаких преобразований в коде не прибавилось. При вызове API не требуется кастов к старому типу, а новый код сам по себе использует только новый тип. В общем, ты преувеличиваешь проблему, делай обертку и не парься.
Re[2]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Кодёнок, Вы писали:
Кё>Я сделал структуру-обертку над FILETIME, и никаких преобразований в коде не прибавилось. При вызове API не требуется кастов к старому типу, а новый код сам по себе использует только новый тип. В общем, ты преувеличиваешь проблему, делай обертку и не парься.
Там проблема еще и в том, что нельзя класс-обертку отнаследовать от _LARGE_INTEGER, ибо он union. Но вроде после доработки напильником что-то получилось:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Там проблема еще и в том, что нельзя класс-обертку отнаследовать от _LARGE_INTEGER, ибо он union. Но вроде после доработки напильником что-то получилось:
ЕМ>
Здравствуйте, Евгений Музыченко, Вы писали:
NB>>по идее без них должно работать (дефаултавый). лишнее конструирование компилятор может соптимизировать.
ЕМ>Ну да, с однотипным присваиванием я погорячился, а для интегральных-то типов без спецоператора не обойтись, как он догадается, что с ними делать?
создаст временную LargeInteger(конструкторы то не explicit) и передаст в оператор копирования.
Re[9]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, night beast, Вы писали:
NB>>можешь, конечно, переопределить какой нибудь operator << но operator = никак получится.
ЕМ>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.
Дальше пошла масса сторонних обсуждений, но этот вопрос вполне резонен.
Поскольку для каждого класса есть предопределенное копирующее присваивание, программист может рассчитывать на него, если не видит в интерфейсе класса перегрузки operator=.
Представим, что разрешено перегружать присваивание свободной операторной функцией. Тогда ее появление где-то в массе совсем не имеющих отношения к определению класса включений могло бы разительно изменить семантику кода исходного модуля. Это не есть хорошо, и это запрещено простой оговоркой о нестатическом члене класса.
Дополнительно — гарантируется, что слева от = всегда будет объект данного класса (потенциально — lvalue). Что и требуется от столь фундаментальной вещи, как присваивание.
Re: Можно ли присобачить оператор присваивания к структуре?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В винде есть структура LARGE_INTEGER, представляющая 64-разрядные значения. Она неудобна тем, что для 64-разрядных операций нужно специально указывать поле .QuadPart, и тем, что это поле знаковое — нельзя присвоить ему беззнаковое значение без преобразования. Не смертельно, но получается уж больно громоздко.
ЕМ>А оператор присваивания непременно должен быть членом класса. Если порождать класс от _LARGE_INTEGER, то придется вводить преобразования к дочернему классу — одни громоздкие построения заменяются на другие.
ЕМ>Может, есть способ присобачить оператор присваивания минимальными усилиями?
А может, просто кастить этот самый LARGE_INTEGER к __int64 когда нужно ? Один черт — 64 бита.
With best regards
Pavel Dvorkin
Re[8]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, night beast, Вы писали:
NB>создаст временную LargeInteger(конструкторы то не explicit) и передаст в оператор копирования.
Поэкспериментировал. MS VС это делает как-то странно: конструктора, принимающего INT64, ему для этого недостаточно — требуется либо оператор присваивания, принимающий INT/UINT, либо конструктор, принимающий строго INT. Конструктору, принимающему UINT, передавать не желает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Можно ли присобачить оператор присваивания к структур
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>А может, просто кастить этот самый LARGE_INTEGER к __int64 когда нужно ? Один черт — 64 бита.
ЕМ>Тоже можно, но я всю эту возню затеял, чтобы избавиться от хронических кастингов туда-сюда.
Можно макрос сделать и запись кастинга будет простой.
With best regards
Pavel Dvorkin
Re[4]: Можно ли присобачить оператор присваивания к структур
ЕМ>Хочется именно присобачить оператор присваивания прямо к существующему классу LARGE_INTEGER.
Присваивание не получится.
Но можно оператор сдвига <<
Будешь писать так:
large_int << 5;
На мой вкус, вполне наглядно.
Да здравствует мыло душистое и веревка пушистая.
Re[8]: Можно ли присобачить оператор присваивания к структур