Re[4]: [C++] Перегрузка ?:
От: Кодт Россия  
Дата: 03.08.04 11:17
Оценка: 8 (6)
Здравствуйте, Sinclair, Вы писали:

К>>Вот как раз оператор "," перегружается на раз.

К>> Век живи — век учись... За...чем?
К>>Правда, делают это извращенцы (имхо)...
S>Ага. Интересно, какой такой великий смысл можно вложить в перегрузку запятой? Сделать ее возвращающей второе значение, а не первое?

Например, упаковку кортежа для передачи в функцию с переменным числом параметров.
strint output = formatter("%1 %2 %3 %4!"),"oh","beautiful","new","world";

где
class formatter
{
  string format_;
  mutable vector<string> args_; // можно сделать без mutable - но там будут песни и пляски
public:
  formatter(const strign& format) : format_(format) {}

  operator string() const { ..... } // в общем, что-то там делает

  template<class T>
  const formatter& operator,(const T& v) const { append(v); return *this; }

  void append(const string& s) const { args_.push_back(s); }
  // и прочие типы
};

Хотя это не добавляет читаемости.
Уж лучше перегрузить оператор <<, &, % (как, например, в Qt).
Перекуём баги на фичи!
Re[6]: [C++] Перегрузка ?:
От: Кодт Россия  
Дата: 04.08.04 08:28
Оценка: 5 (4)
Здравствуйте, LaptevVV, Вы писали:

LVV>Кодт, какие "песни и пляски" имеются ввиду? Если formatter объявят const?


А такие, что где-то надо держать кортеж параметров.
Поскольку formatter("xxx") — это r-value (приводимое к const l-value), то
(formatter("xxx") << arg1),
по хорошему, не должен менять состояние форматтера.
Это можно сделать 3 способами:

1) Результат операции — новый объект, хранящий в себе и форматтера, и аргумент. Результат следующей операции — ещё один объект, и так далее.
В принципе, это выгодно с точки зрения расхода памяти и compile-time полиморфизма (все аргументы можно хранить по ссылке — время их жизни равно времени жизни выражения), но структуры данных будут... нетривиальные. Односвязный список с хвоста в начало, либо размещённый в куче список с начала в хвост.

2) Форматтер меняет внутреннее состояние, оставаясь константным внешне.
2.1) У него есть член — указатель на структуру данных, размещённую в куче. Константность объекта формально не навязывает константность агрегату, доступному по указателю/ссылке.
2.2) Эта структура данных является членом, объявленным как mutable. Те же яйца, только в профиль; ну и нет возни с памятью.
Перекуём баги на фичи!
Re[4]: [C++] Перегрузка ?:
От: PM  
Дата: 03.08.04 11:30
Оценка: 4 (3)
Здраствуйте, Sinclair, Вы писали:

S> Здравствуйте, Кодт, Вы писали:

К>> Вот как раз оператор "," перегружается на раз.
К>> Век живи — век учись... За...чем?
К>> Правда, делают это извращенцы (имхо)...
S> Ага. Интересно, какой такой великий смысл можно вложить в перегрузку
S> запятой? Сделать ее возвращающей второе значение, а не первое?

Если есть возможность, можно и смысл вложить
class Date
{
  public:
    int year;
    int month;
    int day;

    static void describe(descriptor<Date>& class_)
    {
        class_("Date")
        [
            member(&Date::year,  "year" ),        // <- вот он, operator ,
            member(&Date::month, "month"),    // и здесь
            member(&Date::day,   "day"  )        // и здесь
        ];
    }
};

Взято из проекта "Visitor-based framework to describe classes". Проскакивало как-то на lists.boost.org
Насколько я понимаю, здесь operator , используется для создания аргумента для operator[].
foobar2000 v0.8.2: выключен.
Re[2]: [C++] Перегрузка ?:
От: Кодт Россия  
Дата: 03.08.04 10:46
Оценка: :)))
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, _nn_, Вы писали:


__>>Почему нельзя перегружать этот оператор ?

S>По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch.

Вот как раз оператор "," перегружается на раз.
Правда, делают это извращенцы (имхо)...

К тому же, if,for,while,switch — это ключевые слова стейтментов, а не операторы.
Перекуём баги на фичи!
Re[3]: [C++] Перегрузка ?:
От: Vladimir_K  
Дата: 03.08.04 15:40
Оценка: 58 (2)
Здравствуйте, Кодт, Вы писали:

__>>>Почему нельзя перегружать этот оператор ?

S>>По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch.
К>Вот как раз оператор "," перегружается на раз.
К>Правда, делают это извращенцы (имхо)...

Ну зачем же так всех под одну гребенку. Вот, например, здесь можно найти вполне оправданную перегрузку оператора запятая.
http://www.intelib.org/
Re[4]: [C++] Перегрузка ?:
От: korzhik Россия  
Дата: 03.08.04 13:58
Оценка: 2 (1)
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Кодт, Вы писали:


К>>Вот как раз оператор "," перегружается на раз.

К>>Правда, делают это извращенцы (имхо)...
WH>Ну operator, еиднственная функция в С++ которая может принимать void, а это может иногда оказаться полезным.

здесь
Автор: folk
Дата: 19.04.04
например
Re[3]: [C++] Перегрузка ?:
От: WolfHound  
Дата: 03.08.04 11:56
Оценка: 1 (1)
Здравствуйте, Кодт, Вы писали:

К>Вот как раз оператор "," перегружается на раз.

К>Правда, делают это извращенцы (имхо)...
Ну operator, еиднственная функция в С++ которая может принимать void, а это может иногда оказаться полезным.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: [C++] Перегрузка ?:
От: Кодт Россия  
Дата: 03.08.04 15:56
Оценка: +1
Здравствуйте, Vladimir_K, Вы писали:

V_K>Ну зачем же так всех под одну гребенку. Вот, например, здесь можно найти вполне оправданную перегрузку оператора запятая.

V_K>http://www.intelib.org/

Извращенцы, в самом лучшем смысле этого слова !
Нужно подумать, куда это можно будет присобачить...
Перекуём баги на фичи!
[C++] Перегрузка ?:
От: _nn_ www.nemerleweb.com
Дата: 03.08.04 08:28
Оценка:
Почему нельзя перегружать этот оператор ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: [C++] Перегрузка ?:
От: Кодт Россия  
Дата: 03.08.04 08:33
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Почему нельзя перегружать этот оператор ?


А зачем?
Что за хитрую конструкцию ты затеял, где эта перегрузка потребовалась?
Перекуём баги на фичи!
Re[2]: [C++] Перегрузка ?:
От: _nn_ www.nemerleweb.com
Дата: 03.08.04 09:05
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, _nn_, Вы писали:


__>>Почему нельзя перегружать этот оператор ?


К>А зачем?

К>Что за хитрую конструкцию ты затеял, где эта перегрузка потребовалась?

Вообще-то вопрос был про то почему не дали возможность перегружать этот оператор ?
А насчет применений, придумаем
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: [C++] Перегрузка ?:
От: LaptevVV Россия  
Дата: 03.08.04 09:18
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Почему нельзя перегружать этот оператор ?

Может быть — просто синтаксические трудности с выделением соответствующих частей. Если помотришь на остальные операторы, то они "компактные", а этот — "распределенный". И выражений аж три, а в остальных — либо 1, либо 2.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: [C++] Перегрузка ?:
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.08.04 10:43
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Почему нельзя перегружать этот оператор ?

По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: [C++] Перегрузка ?:
От: Leonid V. Volnin Россия  
Дата: 03.08.04 11:01
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Sinclair, Вы писали:


S>>Здравствуйте, _nn_, Вы писали:


__>>>Почему нельзя перегружать этот оператор ?

S>>По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch.

К>Вот как раз оператор "," перегружается на раз.

К>Правда, делают это извращенцы (имхо)...

К>К тому же, if,for,while,switch — это ключевые слова стейтментов, а не операторы.


нну, слова new, delete тоже ключевые. однако перегружаются себе и ничего .
best regards, Leonid
Re[3]: [C++] Перегрузка ?:
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.08.04 11:03
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Вот как раз оператор "," перегружается на раз.
К> Век живи — век учись... За...чем?
К>Правда, делают это извращенцы (имхо)...
Ага. Интересно, какой такой великий смысл можно вложить в перегрузку запятой? Сделать ее возвращающей второе значение, а не первое?
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: [C++] Перегрузка ?:
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 03.08.04 11:06
Оценка:
Здравствуйте, _nn_, Вы писали:

__>А насчет применений, придумаем


Мне кажеться, что двигаться надо как раз от противного. Разрешать только то, без чего нет жизни...
Re[4]: [C++] Перегрузка ?:
От: Sergey J. A. Беларусь  
Дата: 03.08.04 11:12
Оценка:
Здравствуйте, Leonid V. Volnin, Вы писали:

__>>>>Почему нельзя перегружать этот оператор ?

S>>>По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch.

К>>Вот как раз оператор "," перегружается на раз.

К>>Правда, делают это извращенцы (имхо)...

К>>К тому же, if,for,while,switch — это ключевые слова стейтментов, а не операторы.


LVV>нну, слова new, delete тоже ключевые. однако перегружаются себе и ничего .


Перегружаются operator new и operator delete, а не new и delete. Есть разница.
В двух словах — new вызывает operator new для выделения памяти, а потом вызывает конструктор.
Я — свихнувшееся сознание Джо.
Re[4]: [C++] Перегрузка ?:
От: jazzer Россия Skype: enerjazzer
Дата: 03.08.04 11:15
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Кодт, Вы писали:

К>>Вот как раз оператор "," перегружается на раз.
К>>:wow: Век живи — век учись... За...чем?
К>>Правда, делают это извращенцы (имхо)...
S>Ага. Интересно, какой такой великий смысл можно вложить в перегрузку запятой? Сделать ее возвращающей второе значение, а не первое?

так она и так второе возвращает :)

обычно вкладывают такой же смысл, какой вкладывается в перегруженный operator<<, из которого можно делать цепочки: согласись, цепочка запятых смотрится куда естественнее
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: [C++] Перегрузка ?:
От: _nn_ www.nemerleweb.com
Дата: 03.08.04 13:54
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, _nn_, Вы писали:


__>>А насчет применений, придумаем


M>Мне кажеться, что двигаться надо как раз от противного. Разрешать только то, без чего нет жизни...

Может кому-то нет жизни без этого
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: [C++] Перегрузка ?:
От: achp  
Дата: 03.08.04 16:09
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Почему нельзя перегружать этот оператор ?


Как нельзя? Ты только что это сделал!

PS. Представляю себе, как формулировались бы правила по выбору нужной сигнатуры среди всех доступных...
Re[5]: [C++] Перегрузка ?:
От: LaptevVV Россия  
Дата: 04.08.04 07:50
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Например, упаковку кортежа для передачи в функцию с переменным числом параметров.

К>
К>strint output = formatter("%1 %2 %3 %4!"),"oh","beautiful","new","world";
К>

К>где
К>
К>class formatter
К>{
К>  string format_;
К>  mutable vector<string> args_; // можно сделать без mutable - но там будут песни и пляски
К>public:
К>  formatter(const strign& format) : format_(format) {}

К>  operator string() const { ..... } // в общем, что-то там делает

К>  template<class T>
К>  const formatter& operator,(const T& v) const { append(v); return *this; }

К>  void append(const string& s) const { args_.push_back(s); }
К>  // и прочие типы
К>};
К>

Я подозревал, что так и можно сделать, но никогда реально не пробовал. Класс!
Кодт, какие "песни и пляски" имеются ввиду? Если formatter объявят const?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: [C++] Перегрузка ?:
От: Larm Украина  
Дата: 04.08.04 08:30
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Почему нельзя перегружать этот оператор ?


Потому что сложно компилятору это. Ведь оба последних аргумента должны быть одного типа. Это накладывает некие ограничения на синтаксис декларации этого оператора... Да и не понятно, что им еще делать. Будет надо — перегрузят .
The God who walks is among us...
Re[7]: [C++] Перегрузка ?:
От: LaptevVV Россия  
Дата: 04.08.04 08:30
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, LaptevVV, Вы писали:


LVV>>Кодт, какие "песни и пляски" имеются ввиду? Если formatter объявят const?


К>А такие, что где-то надо держать кортеж параметров.

К>Поскольку formatter("xxx") — это r-value (приводимое к const l-value), то
К>(formatter("xxx") << arg1),
К>по хорошему, не должен менять состояние форматтера.
К>Это можно сделать 3 способами:

К>1) Результат операции — новый объект, хранящий в себе и форматтера, и аргумент. Результат следующей операции — ещё один объект, и так далее.

К>В принципе, это выгодно с точки зрения расхода памяти и compile-time полиморфизма (все аргументы можно хранить по ссылке — время их жизни равно времени жизни выражения), но структуры данных будут... нетривиальные. Односвязный список с хвоста в начало, либо размещённый в куче список с начала в хвост.

К>2) Форматтер меняет внутреннее состояние, оставаясь константным внешне.

К>2.1) У него есть член — указатель на структуру данных, размещённую в куче. Константность объекта формально не навязывает константность агрегату, доступному по указателю/ссылке.
К>2.2) Эта структура данных является членом, объявленным как mutable. Те же яйца, только в профиль; ну и нет возни с памятью.
Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: [C++] Перегрузка ?:
От: Кодт Россия  
Дата: 04.08.04 09:10
Оценка:
Здравствуйте, Larm, Вы писали:

L>Потому что сложно компилятору это. Ведь оба последних аргумента должны быть одного типа. Это накладывает некие ограничения на синтаксис декларации этого оператора... Да и не понятно, что им еще делать. Будет надо — перегрузят .


Это необязательно. Главное, чтобы тип результата был известен

Сложность здесь в другом. Если первый аргумент (селектор) имеет тип, приводимый к bool, то автоматически должен применяться встроенный оператор.
Перекуём баги на фичи!
Re[3]: [C++] Перегрузка ?:
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.08.04 04:16
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Сложность здесь в другом. Если первый аргумент (селектор) имеет тип, приводимый к bool, то автоматически должен применяться встроенный оператор.


"obj ? true_part : false_part" мог бы быть равен "obj.operator?: ( true_part, false_part )"

Мне кажется, что из-за необходимости вычисления обоих аргументов для передачи в перегруженный оператор. Это наглядно показывает тот же VB, в iif(cond,true_part,false_part) которого все части вычисляются.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: [C++] Перегрузка ?:
От: _nn_ www.nemerleweb.com
Дата: 05.08.04 07:12
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Кодт, Вы писали:


К>>Сложность здесь в другом. Если первый аргумент (селектор) имеет тип, приводимый к bool, то автоматически должен применяться встроенный оператор.


Vi2>
Vi2>"obj ? true_part : false_part" мог бы быть равен "obj.operator?: ( true_part, false_part )"
Vi2>

Vi2>Мне кажется, что из-за необходимости вычисления обоих аргументов для передачи в перегруженный оператор. Это наглядно показывает тот же VB, в iif(cond,true_part,false_part) которого все части вычисляются.

Может перегрузку делать так :

condition ? true_part : false_part;

obj.operator?:(part) // в part будет true_part или false_part в зависимости от условия и ничего не будет вычислятся лишнего.


Единственная проблема с типом возврата...

Может тогда так :
template<typename TRet,typename TPart>
TRet my_class::operator?:(cosnt TPart& part); // для lvalue

template<typename TRet,typename TPart>
TRet& my_class::operator?:(cosnt TPart& part); // для rvalue
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: [C++] Перегрузка ?:
От: Кодт Россия  
Дата: 05.08.04 08:05
Оценка:
Здравствуйте, Vi2, Вы писали:

К>>Сложность здесь в другом. Если первый аргумент (селектор) имеет тип, приводимый к bool, то автоматически должен применяться встроенный оператор.


Vi2>
Vi2>"obj ? true_part : false_part" мог бы быть равен "obj.operator?: ( true_part, false_part )"
Vi2>


Да уж объявить-то проблемы не будет.

Vi2>Мне кажется, что из-за необходимости вычисления обоих аргументов для передачи в перегруженный оператор. Это наглядно показывает тот же VB, в iif(cond,true_part,false_part) которого все части вычисляются.


Ну и что, а в перегруженном операторе && тоже обе части выполняются.

Мне кажется, что засада — в том, что перегузка ?: с пользовательским типом, приводимым к bool, даст конфликт...
Перекуём баги на фичи!
Re[4]: [C++] Перегрузка ?:
От: Комаров Иван Россия  
Дата: 06.08.04 07:57
Оценка:
Здравствуйте, Leonid V. Volnin, Вы писали:


LVV>нну, слова new, delete тоже ключевые. однако перегружаются себе и ничего .


Как раз таки слова не перегружаются. Перегружаются одноименные операторы, о чем уже заметил Sergey J. A.
Думай, прежде чем родиться в этой сказочной стране!
(с) Антон Духовской
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.