Можно ли присобачить оператор присваивания к структуре?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 10:22
Оценка:
В винде есть структура LARGE_INTEGER, представляющая 64-разрядные значения. Она неудобна тем, что для 64-разрядных операций нужно специально указывать поле .QuadPart, и тем, что это поле знаковое — нельзя присвоить ему беззнаковое значение без преобразования. Не смертельно, но получается уж больно громоздко.

А оператор присваивания непременно должен быть членом класса. Если порождать класс от _LARGE_INTEGER, то придется вводить преобразования к дочернему классу — одни громоздкие построения заменяются на другие.

Может, есть способ присобачить оператор присваивания минимальными усилиями?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Можно ли присобачить оператор присваивания к структуре?
От: Lorenzo_LAMAS  
Дата: 08.04.11 10:31
Оценка:
ЕМ>Может, есть способ присобачить оператор присваивания минимальными усилиями?

А вы присваиваете один LARGE_INTEGER другому или как? Просто, зачем вам вообще переопределять оператор?
Of course, the code must be complete enough to compile and link.
Re[2]: Можно ли присобачить оператор присваивания к структур
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 10:37
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>А вы присваиваете один LARGE_INTEGER другому или как? Просто, зачем вам вообще переопределять оператор?


Я LARGE_INTEGER использую только через поле QuadPart — простое 64-разрядное значение. Поэтому хотелось бы иметь оператор, позволяющий просто присваивать значение переменной типа LARGE_INTEGER, не залезая в поле, а также присваивать беззнаковые значения с автоматическим преобразованием. А глобально отключать предупреждения на несоответствие знаковости/беззнаковости типа не хочу — они нужны.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Можно ли присобачить оператор присваивания к структур
От: night beast СССР  
Дата: 08.04.11 10:41
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

L_L>>А вы присваиваете один LARGE_INTEGER другому или как? Просто, зачем вам вообще переопределять оператор?


ЕМ>Я LARGE_INTEGER использую только через поле QuadPart — простое 64-разрядное значение. Поэтому хотелось бы иметь оператор, позволяющий просто присваивать значение переменной типа LARGE_INTEGER, не залезая в поле, а также присваивать беззнаковые значения с автоматическим преобразованием. А глобально отключать предупреждения на несоответствие знаковости/беззнаковости типа не хочу — они нужны.


а можешь пример кода привести, что хотелось бы получить в итоге?
Re[3]: Можно ли присобачить оператор присваивания к структур
От: XuMuK Россия  
Дата: 08.04.11 10:59
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Lorenzo_LAMAS, Вы писали:


L_L>>А вы присваиваете один LARGE_INTEGER другому или как? Просто, зачем вам вообще переопределять оператор?


ЕМ>Я LARGE_INTEGER использую только через поле QuadPart — простое 64-разрядное значение. Поэтому хотелось бы иметь оператор, позволяющий просто присваивать значение переменной типа LARGE_INTEGER, не залезая в поле, а также присваивать беззнаковые значения с автоматическим преобразованием. А глобально отключать предупреждения на несоответствие знаковости/беззнаковости типа не хочу — они нужны.


а обязательно использовать именно LARGE_INTEGER? можно взять тот же boost::uint64_t, например
Re[4]: Можно ли присобачить оператор присваивания к структур
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 11:05
Оценка:
Здравствуйте, night beast, Вы писали:

NB>а можешь пример кода привести, что хотелось бы получить в итоге?


Хм, здесь разве можно что-то понять превратно?

ULONG KeQueryTimeIncrement ();
ULONG KeQueryInterruptTime ();

LARGE_INTEGER TickCount, TicksPerSecond;

TicksPerSecond = 10000000 / KeQueryTimeIncrement ();
TickCount = KeQueryInterruptTime ();


Функции KeXxx, понятное дело, не мои — виндовые, и структуры нужно тоже передать винде. Для внутренних нужд я пользуюсь UINT64, здесь никаких проблем нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Можно ли присобачить оператор присваивания к структур
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 11:08
Оценка:
Здравствуйте, XuMuK, Вы писали:

XMK>а обязательно использовать именно LARGE_INTEGER? можно взять тот же boost::uint64_t, например


Для своих целей я использую обычный UINT64, вполне хватает. Но в ряде случаев и винда дает значения в LARGE_INTEGER, и ей их нужно передавать так же.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Можно ли присобачить оператор присваивания к структур
От: night beast СССР  
Дата: 08.04.11 11:25
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

NB>>а можешь пример кода привести, что хотелось бы получить в итоге?


ЕМ>Хм, здесь разве можно что-то понять превратно?


ЕМ>
ЕМ>ULONG KeQueryTimeIncrement ();
ЕМ>ULONG KeQueryInterruptTime ();

ЕМ>LARGE_INTEGER TickCount, TicksPerSecond;

ЕМ>TicksPerSecond = 10000000 / KeQueryTimeIncrement ();
ЕМ>TickCount = KeQueryInterruptTime ();
ЕМ>


возьмем за начальное приближение такой код:
struct integer {
   LARGE_INTEGER value;

   integer () {}
   integer ( LARGE_INTEGER src ) : value( src ) {}
   integer ( LONGLONG src ) { value.QuadPart = src; }

   operator LARGE_INTEGER () const { return value; }
};


не подходит?
Re[5]: Можно ли присобачить оператор присваивания к структур
От: Alexey F  
Дата: 08.04.11 11:33
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>ULONG KeQueryTimeIncrement ();
ЕМ>ULONG KeQueryInterruptTime ();

ЕМ>LARGE_INTEGER TickCount, TicksPerSecond;

ЕМ>TicksPerSecond = 10000000 / KeQueryTimeIncrement ();
ЕМ>TickCount = KeQueryInterruptTime ();


Может, как вариант, просто ввести внешнюю ф-цию?:
inline void set( LARGE_INTEGER& integer, UINT64 const value ) {
    integer.QuadPart = static_cast<LONGLONG>( value );
}

...
set( TicksPerSecond, 10000000 / KeQueryTimeIncrement () );
set( TickCount, KeQueryInterruptTime () );

Я бы не сказал что это будет радикально отличаться от присваивания.
Re[6]: Можно ли присобачить оператор присваивания к структур
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 12:08
Оценка:
Здравствуйте, night beast, Вы писали:

NB>возьмем за начальное приближение такой код:


Так понятно, что через промежуточные классы/переменные все решается элементарно. Но уж если браться — хочется сделать элегантно, а тут придется либо вводить переменные типа integer, либо явные преобразования.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Можно ли присобачить оператор присваивания к структур
От: night beast СССР  
Дата: 08.04.11 12:17
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

NB>>возьмем за начальное приближение такой код:


ЕМ>Так понятно, что через промежуточные классы/переменные все решается элементарно. Но уж если браться — хочется сделать элегантно, а тут придется либо вводить переменные типа integer, либо явные преобразования.


да.
можешь, конечно, переопределить какой нибудь operator << но operator = никак получится.
Re[6]: Можно ли присобачить оператор присваивания к структур
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 12:23
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Может, как вариант, просто ввести внешнюю ф-цию?:


В большом проекте функция set не годится — ее нужно будет как-то длинно и понятно обозвать, и из текста не будет очевиден смысл действия. Хочется именно присобачить оператор присваивания прямо к существующему классу LARGE_INTEGER. И на кой стандартом это запрещено?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Можно ли присобачить оператор присваивания к структур
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 12:35
Оценка:
Здравствуйте, night beast, Вы писали:

NB>можешь, конечно, переопределить какой нибудь operator << но operator = никак получится.


А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Можно ли присобачить оператор присваивания к структур
От: Alexey F  
Дата: 08.04.11 12:45
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>В большом проекте функция set не годится — ее нужно будет как-то длинно и понятно обозвать, и из текста не будет очевиден смысл действия. Хочется именно присобачить оператор присваивания прямо к существующему классу LARGE_INTEGER. И на кой стандартом это запрещено?

set, assign — в принципе, не такие и плохие имена для свободной ф-ции или семейства свободных ф-ций, устанавливающих значение. Может, подошли бы setUnsigned или assignUnsigned, т.к. нет точного соответствия между типом QuadPart (LONGLONG) и вторым их аргументом (UINT64) (с другой стороны, перегруженные ф-ции для того и делаются, чтобы избавиться от таких имён).
Можно оставить явный operator= в коде, но модифицировав левую часть присваивания:
ref( TicksPerSecond ) = 10000000 / KeQueryTimeIncrement ();
ref( TickCount ) = KeQueryInterruptTime ();

, где ref:
struct LargeIntegerRef {
    LargeIntegerRef( LARGE_INTEGER& ref )
        : ref_( ref ) {}

    LargeIntegerRef& operator=( UINT64 const value ) {
        ref_.QuadPart = static_cast<LONGLONG>( value );
        return *this;
    }

private:
    LARGE_INTEGER& ref_;
};

inline LargeIntegerRef ref( LARGE_INTEGER& ref ) {
    return ref;
}
Re[9]: Можно ли присобачить оператор присваивания к структур
От: night beast СССР  
Дата: 08.04.11 13:06
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

NB>>можешь, конечно, переопределить какой нибудь operator << но operator = никак получится.


ЕМ>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.


не знаю. возможно сочли не целесообразным.
Re[10]: Можно ли присобачить оператор присваивания к структу
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.04.11 14:22
Оценка:
Здравствуйте, night beast, Вы писали:

ЕМ>>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.


NB>не знаю. возможно сочли не целесообразным.


Когда считают нецелесообразным — просто не принимают специальных мер. А здесь из множества всех глобальных бинарных операций присваивания специально выделены и запрещены.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Можно ли присобачить оператор присваивания к структур
От: andrey.desman  
Дата: 08.04.11 18:30
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.


Чтоб ты не переопределил присваивание для интов и других встроенных типов. То же самое касается и ->, [] и что там еще было?
Может еще потому, что operator= генерится компилятором, если не реализуешь свой. Может каким-то образом это облегчает задачу компиляторописателям.
Re[10]: Можно ли присобачить оператор присваивания к структу
От: andrey.desman  
Дата: 08.04.11 18:38
Оценка:
Здравствуйте, 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]: Можно ли присобачить оператор присваивания к структу
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 09.04.11 14:49
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Чтоб ты не переопределил присваивание для интов и других встроенных типов.


Про встроенные типы речи вообще не шло. Я именно про структуры/классы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Можно ли присобачить оператор присваивания к структур
От: gegMOPO4  
Дата: 09.04.11 20:37
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, night beast, Вы писали:
NB>>можешь, конечно, переопределить какой нибудь operator << но operator = никак получится.
ЕМ>А почему, кстати? Я плохо разбираюсь в тонкостях парадигмы C++, поэтому очевидной причины для такого запрета не улавливаю.

Потому, что оператор присваивания неявно генерируется компилятором, если он не определён.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.