Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, _nn_, Вы писали:
__>>Почему нельзя перегружать этот оператор ?
К>А зачем? К>Что за хитрую конструкцию ты затеял, где эта перегрузка потребовалась?
Вообще-то вопрос был про то почему не дали возможность перегружать этот оператор ?
А насчет применений, придумаем
Здравствуйте, _nn_, Вы писали:
__>Почему нельзя перегружать этот оператор ?
Может быть — просто синтаксические трудности с выделением соответствующих частей. Если помотришь на остальные операторы, то они "компактные", а этот — "распределенный". И выражений аж три, а в остальных — либо 1, либо 2.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, _nn_, Вы писали:
__>Почему нельзя перегружать этот оператор ?
По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, _nn_, Вы писали:
__>>Почему нельзя перегружать этот оператор ? S>По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch.
Вот как раз оператор "," перегружается на раз.
Правда, делают это извращенцы (имхо)...
К тому же, if,for,while,switch — это ключевые слова стейтментов, а не операторы.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Sinclair, Вы писали:
S>>Здравствуйте, _nn_, Вы писали:
__>>>Почему нельзя перегружать этот оператор ? S>>По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch.
К>Вот как раз оператор "," перегружается на раз. К>Правда, делают это извращенцы (имхо)...
К>К тому же, if,for,while,switch — это ключевые слова стейтментов, а не операторы.
нну, слова new, delete тоже ключевые. однако перегружаются себе и ничего .
Здравствуйте, Кодт, Вы писали: К>Вот как раз оператор "," перегружается на раз. К> Век живи — век учись... За...чем? К>Правда, делают это извращенцы (имхо)...
Ага. Интересно, какой такой великий смысл можно вложить в перегрузку запятой? Сделать ее возвращающей второе значение, а не первое?
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, 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 для выделения памяти, а потом вызывает конструктор.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Кодт, Вы писали: К>>Вот как раз оператор "," перегружается на раз. К>>:wow: Век живи — век учись... За...чем? К>>Правда, делают это извращенцы (имхо)... S>Ага. Интересно, какой такой великий смысл можно вложить в перегрузку запятой? Сделать ее возвращающей второе значение, а не первое?
так она и так второе возвращает :)
обычно вкладывают такой же смысл, какой вкладывается в перегруженный operator<<, из которого можно делать цепочки: согласись, цепочка запятых смотрится куда естественнее
Здравствуйте, Sinclair, Вы писали:
К>>Вот как раз оператор "," перегружается на раз. К>> Век живи — век учись... За...чем? К>>Правда, делают это извращенцы (имхо)... S>Ага. Интересно, какой такой великий смысл можно вложить в перегрузку запятой? Сделать ее возвращающей второе значение, а не первое?
Например, упаковку кортежа для передачи в функцию с переменным числом параметров.
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).
Здраствуйте, 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[].
Здравствуйте, Кодт, Вы писали:
К>Вот как раз оператор "," перегружается на раз. К>Правда, делают это извращенцы (имхо)...
Ну operator, еиднственная функция в С++ которая может принимать void, а это может иногда оказаться полезным.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, _nn_, Вы писали:
__>>А насчет применений, придумаем
M>Мне кажеться, что двигаться надо как раз от противного. Разрешать только то, без чего нет жизни...
Может кому-то нет жизни без этого
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Кодт, Вы писали:
К>>Вот как раз оператор "," перегружается на раз. К>>Правда, делают это извращенцы (имхо)... WH>Ну operator, еиднственная функция в С++ которая может принимать void, а это может иногда оказаться полезным.
Здравствуйте, Кодт, Вы писали:
__>>>Почему нельзя перегружать этот оператор ? S>>По тем же причинам, что нельзя перегрузить запятую и точку с запятой. А также whitespace, операторы if, for, while, switch. К>Вот как раз оператор "," перегружается на раз. К>Правда, делают это извращенцы (имхо)...
Ну зачем же так всех под одну гребенку. Вот, например, здесь можно найти вполне оправданную перегрузку оператора запятая. http://www.intelib.org/
Здравствуйте, Vladimir_K, Вы писали:
V_K>Ну зачем же так всех под одну гребенку. Вот, например, здесь можно найти вполне оправданную перегрузку оператора запятая. V_K>http://www.intelib.org/
Извращенцы, в самом лучшем смысле этого слова !
Нужно подумать, куда это можно будет присобачить...
К>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?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Кодт, какие "песни и пляски" имеются ввиду? Если formatter объявят const?
А такие, что где-то надо держать кортеж параметров.
Поскольку formatter("xxx") — это r-value (приводимое к const l-value), то
(formatter("xxx") << arg1),
по хорошему, не должен менять состояние форматтера.
Это можно сделать 3 способами:
1) Результат операции — новый объект, хранящий в себе и форматтера, и аргумент. Результат следующей операции — ещё один объект, и так далее.
В принципе, это выгодно с точки зрения расхода памяти и compile-time полиморфизма (все аргументы можно хранить по ссылке — время их жизни равно времени жизни выражения), но структуры данных будут... нетривиальные. Односвязный список с хвоста в начало, либо размещённый в куче список с начала в хвост.
2) Форматтер меняет внутреннее состояние, оставаясь константным внешне.
2.1) У него есть член — указатель на структуру данных, размещённую в куче. Константность объекта формально не навязывает константность агрегату, доступному по указателю/ссылке.
2.2) Эта структура данных является членом, объявленным как mutable. Те же яйца, только в профиль; ну и нет возни с памятью.
Здравствуйте, _nn_, Вы писали:
__>Почему нельзя перегружать этот оператор ?
Потому что сложно компилятору это. Ведь оба последних аргумента должны быть одного типа. Это накладывает некие ограничения на синтаксис декларации этого оператора... Да и не понятно, что им еще делать. Будет надо — перегрузят .
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, LaptevVV, Вы писали:
LVV>>Кодт, какие "песни и пляски" имеются ввиду? Если formatter объявят const?
К>А такие, что где-то надо держать кортеж параметров. К>Поскольку formatter("xxx") — это r-value (приводимое к const l-value), то К>(formatter("xxx") << arg1), К>по хорошему, не должен менять состояние форматтера. К>Это можно сделать 3 способами:
К>1) Результат операции — новый объект, хранящий в себе и форматтера, и аргумент. Результат следующей операции — ещё один объект, и так далее. К>В принципе, это выгодно с точки зрения расхода памяти и compile-time полиморфизма (все аргументы можно хранить по ссылке — время их жизни равно времени жизни выражения), но структуры данных будут... нетривиальные. Односвязный список с хвоста в начало, либо размещённый в куче список с начала в хвост.
К>2) Форматтер меняет внутреннее состояние, оставаясь константным внешне. К>2.1) У него есть член — указатель на структуру данных, размещённую в куче. Константность объекта формально не навязывает константность агрегату, доступному по указателю/ссылке. К>2.2) Эта структура данных является членом, объявленным как mutable. Те же яйца, только в профиль; ну и нет возни с памятью.
Спасибо!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Larm, Вы писали:
L>Потому что сложно компилятору это. Ведь оба последних аргумента должны быть одного типа. Это накладывает некие ограничения на синтаксис декларации этого оператора... Да и не понятно, что им еще делать. Будет надо — перегрузят .
Это необязательно. Главное, чтобы тип результата был известен
Сложность здесь в другом. Если первый аргумент (селектор) имеет тип, приводимый к bool, то автоматически должен применяться встроенный оператор.
Здравствуйте, Кодт, Вы писали:
К>Сложность здесь в другом. Если первый аргумент (селектор) имеет тип, приводимый к bool, то автоматически должен применяться встроенный оператор.
"obj ? true_part : false_part" мог бы быть равен "obj.operator?: ( true_part, false_part )"
Мне кажется, что из-за необходимости вычисления обоих аргументов для передачи в перегруженный оператор. Это наглядно показывает тот же VB, в iif(cond,true_part,false_part) которого все части вычисляются.
Здравствуйте, 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); // для lvaluetemplate<typename TRet,typename TPart>
TRet& my_class::operator?:(cosnt TPart& part); // для rvalue
Здравствуйте, 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, даст конфликт...