- 1
[](){}();
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+170
[](){}();
Поздравляю с новым стандартом, товарищи!
wvxvw 14.08.2011 12:09 # +5
Fai 14.08.2011 12:48 # −7
( ( ) ( ( ) ) ( ) )
CPPGovno 14.08.2011 13:00 # +1
Приходится писать, что-то типа:
Притом уродский bind2nd не хочет принимать ссылки на var(приходится использовать указатель), хотя мог бы. И ptr_fun приходится использовать, хотя он тут совсем не нужен.
Или так пишем в старом стандарте, что ещё более громоздко:
А вот в новом стандарте такой проблемы нет:
Это куда читабельнее, меньше писать и удобнее.
Хотя было бы хорошо иметь вывод типов, но и так сойдет, ибо хоть что-то. :)
Kirinyale 14.08.2011 13:51 # 0
А ещё есть boost::function (он же отныне std::function). Незаменимый инструмент для создания методов, итерирующих некоторый инкапсулированный контейнер с вызовом функтора (с заданной сигнатурой, но совершенно произвольным типом) на каждом элементе. Альтернатива - только шаблонный метод, со всеми его недостатками вроде нестрогой типизации и необходимости реализации в заголовочном файле.
CPPGovno 14.08.2011 14:39 # −1
Можно привести пример использования boost::function в данной области, как замена биндигу/каррированию?
>std::function
>std::bind
Это есть только в новом стандарте, так что это лишь повод его "восхвалять".
Kirinyale 14.08.2011 14:48 # 0
Пример:
typedef boost::function<void(SceneNode&)> FunctorNodeRef;
void traverse(const FunctorNodeRef& functor);
Метод класса SceneNode, являющегося, собственно, узлом графической сцены. traverse проходит по всему поддереву сцены, начинающемуся с данного узла, и для каждого узла в поддереве вызывает функтор.
Вызов может выглядеть так:
void SomeClass::foo(SceneNode& node) {}
void SomeClass::bar()
{
node.traverse(boost::bind(&SomeClass::fo o, this, _1));
}
А может и так:
void globalFoo(SceneNode& node) {}
void SomeClass::bar()
{
node.traverse(globalFoo);
}
Один и тот же метод подходит для обоих вариантов.
> Это есть только в новом стандарте,
> так что это лишь повод его "восхвалять".
Я вроде бы и не говорил, что новый стандарт плох. Наоборот, рад, что он заимствует по-настоящему полезные вещи хотя бы из того же буста.
Xom94ok 14.08.2011 23:05 # +4
Поправка: алгоритмы STL удобнее использовать с лямбдами.
CPPGovno 14.08.2011 13:12 # −1
Заменяя это на:
Kirinyale 14.08.2011 13:40 # +1
typedef std::vector<std::string> Strings;
Strings strings;
...
for (Strings::iterator it = strings.begin(); it != it.end(); ++it)
{
...
}
Ещё, если не нужны именно итераторы (например, для удаления), есть вот такая (пускай и не стандартная) штука:
BOOST_FOREACH(const std::string& str, strings)
{
...
}
Разворачивается он, конечно в нечто адское (не знаю насчёт оптимальности), но если скорость не критична, то читабельность важнее, а оптимизациями займётся компилятор.
Короче, кто хотел решать проблемы - решил их для себя давно. Но auto - это тоже хорошо, не спорю. А лямбды - вообще отлично.
CPPGovno 14.08.2011 14:45 # 0
Всё равно это длинно.
>Разворачивается он, конечно в нечто адское (не знаю насчёт оптимальности), но если скорость не критична
Скорость выполнения не страдает. Скорость компиляции - запустил на перекомпиляцию и пошёл играть в домино:
http://xkcd.ru/i/303_v1.png
Kirinyale 14.08.2011 14:55 # 0
Скорость компиляции - это да. "Технологичный" код от этого страдает по определению. Помнится, позаимствовали как-то из того же буста библиотеку для стейт-машин. Почти всё выглядело красиво и удобно, но компилировалось под конец проекта минут 20-25 на машине с четырёхядерным процом и парой гигов оперативки.
На следующем проекте заимствовали только идеи. Самопальная "облегченная и усовершенстованная" либа работает в нашем контексте не хуже (даже лучше), компилируется при тех же масштабах в 4-5 раз быстрее. Что, конечно, тоже многовато. Но что делать - прогресс же.
CPPGovno 14.08.2011 15:23 # −1
У всех методов и систем есть отрицательные стороны. Главное не в том, для чего эти методы и системы можно использовать, а в том, как их применяют.
Используя атомные исследования, не обязательно создавать ядерную бомбу, у них есть и мирные применения.
auto всеж лучше, чем any или dynamic.
CPPGovno 14.08.2011 15:28 # −1
CPPGovno 14.08.2011 15:30 # −2
roman-kashitsyn 15.08.2011 08:48 # 0
На моей генту компиляция chromium с его WebKit - дело довольно долгое и унылое, занимающее несколько часов. Ядро же компилится 20 минут.
Kirinyale 15.08.2011 09:14 # +2
roman-kashitsyn 15.08.2011 11:48 # 0
This is obvious 15.08.2011 12:53 # 0
у меня минуты 2-3 забирает
HINT:core2duo 2,4Ghz + ccache
3Doomer 16.12.2013 21:07 # 0
LispGovno 16.12.2013 23:20 # +1
roman-kashitsyn 16.12.2013 23:34 # +3
bormand 17.12.2013 05:31 # +1
За джва года с половиной года явно прогорело и потухло, уважаемый некромант :)
LispGovno 17.12.2013 07:32 # 0
rat4 17.12.2013 09:06 # +2
eth0 17.12.2013 18:15 # +2
bormand 17.12.2013 18:17 # +1
... играя на балалайке. А потом вы пьете водку с ним и медведем.
kegdan 17.12.2013 18:34 # −15
guest 16.08.2011 07:54 # +3
for (auto it : v)
{
}
CPPGovno 16.08.2011 12:20 # −2
Kirinyale 17.08.2011 15:22 # 0
http://www2.research.att.com/~bs/C%2B%2B0xFAQ.html#for
CPPGovno 17.08.2011 15:27 # −1
Kirinyale 17.08.2011 15:36 # 0
CPPGovno 14.08.2011 13:19 # 0
CPPGovno 18.08.2011 18:31 # −2
Так что без rvalue-ссылок можно обойтись.
gegMOPO4 18.08.2011 20:54 # 0
Matrix a(b + c);
Где именно будет ждать сама матрица результата, пока конструктор не проинициализируется враппером? Нет, можно, конечно, саму матрицу засунуть в динамическую память и использовать подсчёт ссылок, но это будет очень неэффективно.
CPPGovno 18.08.2011 22:20 # 0
Для случая rvalue (а именно ValueWrapper) будет вызываться более быстрый оператор + без лишнего копирования для возвращаемого значения, тк мы используем временную переменную rvalue, которую можно безвозбранно портить, тк она временная и больше никому не нужна. .
CPPGovno 18.08.2011 23:20 # 0
Вывод: без RValue&& ссылок, как инструмента оптимизации, можно обойтись.
CPPGovno 18.08.2011 23:29 # 0
gegMOPO4 19.08.2011 19:28 # 0
1) Нужно реализовывать дубликат для каждой операции, каждого метода.
2) Всё равно будет копирование результата в конечную переменную. Практически то же самое было бы и без враппера.
3) При умножении, а не сложении, матриц преимуществ не будет, а недостатки останутся.
CPPGovno 19.08.2011 21:14 # 0
Я так и не понял, почему первоначальная не заработала... :(
gegMOPO4 19.08.2011 21:43 # 0
CPPGovno 19.08.2011 21:50 # 0
Хотя вы, наверное, это и сказали.
Спасибо. :)
gegMOPO4 19.08.2011 22:06 # 0
CPPGovno 19.08.2011 21:17 # 0
2) От этого можно как-то уйти? В случае RValue-ссылок такой проблемы разве не будет?
3) Это есть и после введения RValue-ссылок.
gegMOPO4 19.08.2011 21:57 # 0
2) Конструкторы и присваивания с семантикой move — то, зачем rvalue-ссылки и введены.
3) Для подобного типа достаточно RVO. А вот были бы данные в динамической памяти, была бы выгода от move (и без затрат на счётчик ссылок).
CPPGovno 19.08.2011 23:57 # 0
>то, зачем rvalue-ссылки и введены.
А я думал их для оптимизации ввели, а move-семантика - побочный эффект. :-[
gegMOPO4 20.08.2011 12:11 # 0
Kirinyale 14.08.2011 14:02 # +2
CPPGovno 14.08.2011 14:46 # −2
Kirinyale 14.08.2011 14:59 # +4
rat4 14.08.2011 16:08 # +2
CPPGovno 14.08.2011 15:35 # −2
SmackMyBitchUp 14.08.2011 17:05 # 0
SmackMyBitchUp 15.08.2011 10:43 # 0