Range Operators для C++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 26.07.13 13:43
Оценка: 13 (2) +1 -3 :))) :))
Попалась на глаза довольно интересная (правда пока что глючная) библиотечка для C++, позволяющая делать, например, так:

#include <ro/ro.h>
using namespace ro;

int main() {
    vector<int> vec {1,2,3};
    vec - 2;
    vec << 4;
    for (int x: vec) {
        cout << x << " ";
    }
    cout << endl;
}

> ./a.out
1 3 4

При сборке требует флага -std=c++11, Clang не собирается
Re: Range Operators для C++
От: Abyx Россия  
Дата: 26.07.13 13:57
Оценка: +2 -1
Здравствуйте, kaa.python, Вы писали:

KP>Попалась на глаза довольно интересная (правда пока что глючная) библиотечка для C++, позволяющая делать, например, так:


KP>[ccode]

KP> vec — 2;
KP> vec << 4;
KP>[/code]
и что это значит?
In Zen We Trust
Re[2]: Range Operators для C++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 26.07.13 13:58
Оценка: +1 -2
Здравствуйте, Abyx, Вы писали:

A>и что это значит?


А по выводу на консоль ты не сообразил? Пичалька
Re[2]: Range Operators для C++
От: omgOnoz  
Дата: 26.07.13 14:01
Оценка:
KP>>[ccode]
KP>> vec — 2; // удалить 2ой элемент из vec
KP>> vec << 4; // добавить 4 в конец
KP>>[/code]
A>и что это значит?
Re[3]: Range Operators для C++
От: omgOnoz  
Дата: 26.07.13 14:02
Оценка:
Это не печаль, без просмотра http://volnitsky.com/project/ro/ — в написанном коде черт ногу сломит
Re[4]: Range Operators для C++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 26.07.13 14:06
Оценка: -2
Здравствуйте, omgOnoz, Вы писали:

O>Это не печаль, без просмотра http://volnitsky.com/project/ro/ — в написанном коде черт ногу сломит


А вот Scala-разработчики с тобой бы не согласились. В целом, ощущение двоякие, с одной стороны можно лаконичнее написать код, так v.push_back(foo) выглядит не так красиво как vec << foo, а с другой стороны, дополнительные потенциальные ошибки и усложнение гугления.
Re[3]: Range Operators для C++
От: Abyx Россия  
Дата: 26.07.13 14:10
Оценка: +2 -2
Здравствуйте, kaa.python, Вы писали:

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


A>>и что это значит?


KP>А по выводу на консоль ты не сообразил? Пичалька


я код читаю, при чем тут вывод на консоль?
In Zen We Trust
Re[3]: Range Operators для C++
От: Sni4ok  
Дата: 26.07.13 14:11
Оценка: +1
Здравствуйте, omgOnoz, Вы писали:

KP>>>[ccode]

KP>>> vec — 2; // удалить 2ой элемент из vec
KP>>>[/code]
A>>и что это значит?

что вы разучились считать?
Re[5]: Range Operators для C++
От: Abyx Россия  
Дата: 26.07.13 14:13
Оценка: +4 -1
Здравствуйте, kaa.python, Вы писали:

KP>В целом, ощущение двоякие, с одной стороны можно лаконичнее написать код, так v.push_back(foo) выглядит не так красиво как vec << foo, а с другой стороны, дополнительные потенциальные ошибки и усложнение гугления.

я понимаю что автор кода идиот, но как же печально, что находятся люди которым нравится писать угловые скобочки и прочие закорючки вместо нормальных человеческих слов.
кулхацкеры млин.
мат выпилен
In Zen We Trust
Re[4]: Range Operators для C++
От: omgOnoz  
Дата: 26.07.13 14:14
Оценка:
S>что вы разучились считать?
ага
Re[6]: Range Operators для C++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 26.07.13 14:15
Оценка: +1 -1
Здравствуйте, Abyx, Вы писали:

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

A>кулхацкеры млин.

А ты понимаешь, что бывает мнение отличное от твоего? И то что в ряде языков, подобный синтаксис считается нормальным, а не проявленим "кулхацкерства млин".
Re[6]: Range Operators для C++
От: omgOnoz  
Дата: 26.07.13 14:15
Оценка:
ты немерлу не видел
Re[7]: Range Operators для C++
От: omgOnoz  
Дата: 26.07.13 14:19
Оценка:
KP>А ты понимаешь, что бывает мнение отличное от твоего? И то что в ряде языков, подобный синтаксис считается нормальным, а не проявленим "кулхацкерства млин".
Щас прибегут Vamp или enji скажут, что ты не прав :D
Re[8]: Range Operators для C++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 26.07.13 14:21
Оценка: +1 :)
Здравствуйте, omgOnoz, Вы писали:

O>Щас прибегут Vamp или enji скажут, что ты не прав :D


Да ради бога, будет еще одна передача тайного знания из Вечного Леса, не привыкать.
Re: Range Operators для C++
От: UA Украина  
Дата: 26.07.13 14:29
Оценка: 1 (1) +2
Здравствуйте, kaa.python, Вы писали:

Как то нелогично -2 и << 4, почему не + 4?
или уже делали >> 2 и << 4
Re[2]: Range Operators для C++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 26.07.13 14:32
Оценка:
Здравствуйте, UA, Вы писали:

UA>Как то нелогично -2 и << 4, почему не + 4?

UA>или уже делали >> 2 и << 4

Согласен, так было бы более однообразно. Думаю что автор берет в качестве аналогий аналогичные операторы из библиотеки в каком-то другом, знакомом ему языке.
Re: Range Operators для C++
От: fin_81  
Дата: 26.07.13 14:34
Оценка:
Посмотрел примеры. Неплохо.
Но не понравился мап (*), если типы совпадают то исходный контейнер изменяется, если разные — то создается новый. Вроде фильтр (|) тоже изменяет исходный контейнер. Не функционально, не иммутабельно, опасно.
Re[3]: Range Operators для C++
От: UA Украина  
Дата: 26.07.13 14:45
Оценка:
Здравствуйте, kaa.python, Вы писали:

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


UA>>Как то нелогично -2 и << 4, почему не + 4?

UA>>или уже делали >> 2 и << 4

KP>Согласен, так было бы более однообразно. Думаю что автор берет в качестве аналогий аналогичные операторы из библиотеки в каком-то другом, знакомом ему языке.


Просто в С++ перегрузка операторов не настолько гибкая чтобы навешивать произвольные операции. Это хорошо и плохо одновременно.
Re[7]: Range Operators для C++
От: Abyx Россия  
Дата: 26.07.13 15:21
Оценка: 2 (2) +6
Здравствуйте, kaa.python, Вы писали:

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


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

A>>кулхацкеры млин.

KP>А ты понимаешь, что бывает мнение отличное от твоего? И то что в ряде языков, подобный синтаксис считается нормальным, а не проявленим "кулхацкерства млин".


конечно бывает.
есть идиоты, и да, у них тоже есть какие-то мнение.

я надеюсь что ты понимаешь что мнения бывают правильные и неправильные.

если какие-то люди несколько десятков лет назад решили что << это такая красивая стрелочка-елочка, и лучшее использовать ее, чем `shl`. это нормально. на один символ короче, меньше зарезервированных слов.
потом в С++ была проблема с A<B<C> >, но ктож знал про С++

потом когда в IO library стали использовать <<, это тоже было нормально. variadic templates не было, и это был единственный нормальный способ писать в поток. cout.write(1).write(2); как-то не смотрится.
люди повозмущались (что за cout shift-left 1), но в конце концов привыкли.
хотя мнения есть разные. кто-то вроде А. Степанова считает что математические операторы надо использовать только пол назначению, и никак иначе.

и тут в 2013 году на форум притаскивают какую-то говнобиблиотеку, где автор предлагает писать
vector<T> x; x << y;
я это читаю и думаю, это логический сдвиг каждого элемента влево, или сдвиг элементов вектора влево?
а оказывается это push_back.

при этом много лет назад люди изобрели Boost.Assignment
vector<T> x; x += y;
который популярностью вроде особо не пользовался, но кто-то может привык к такому применению +=.

причем в Boost.Assignment была перегружена запятая, и можно писать
x += y, z;
что несколько короче чем x << y << z; в Range Operators

btw, в С++11 добавление нескольких элементов можно реализовать очень просто, без expression-trees — через initializer list
template<typename C, typename T>
void operator+=(C& container, std::initializer_list<T> newItems) {
    for (auto&& item : newItems) container.push_back(std::move(item));
}
In Zen We Trust
Re: Range Operators для C++
От: Evgeny.Panasyuk Россия  
Дата: 26.07.13 15:33
Оценка: 1 (1) -1
Здравствуйте, kaa.python, Вы писали:

KP>
KP>    vector<int> vec {1,2,3};
KP>    vec - 2;
KP>


1. Тут ведь всегда проход по всем элементам (ибо упорядоченность видимо не предполагается)? Слишком много для такой краткой нотации — в итоге на ровном месте будет плодится неэффективность — которую ты даже не заметишь
Автор: kaa.python
Дата: 17.07.13
.
2. Если нужна краткая нотация для часто используемых операций — имхо лучше завести отдельные типы, а не делать ad-hoc'и.
3. В документации автор приводит "аналог":
vec.erase(stl::remove(vec.begin(), vec.end(), x), vec.end());

В то время как в Boost.Range давно есть:
remove_erase(vec, x);
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.