Я тут об этом дцатый раз рассказываю... LRnLA алгоритмы в нас момент реализованы только на С++ (+ кодогенератор питон, гугл в помощь если интересно). Я не говорю что это нельзя сделать больше никак, но в наст момент это сделано так и только так.
Вся визуализация у меня - С++ и питон. Я не говорю что это нельзя сделать больше никак, но ООП там просится (для всяких хитрых контейнеров), а шаблоны нужны для эффективности и исключения оверхеда по коду.
C++ это и есть Си с классами и шаблонами. Все остальные различия - в мелких мелочах, которые не слишком меняют суть. Тем не менее, к C++ не применим сишный стиль программирования.
Среди примеров, думаю, будет только Qt - в нем свою стандартную библиотеку написали только потому, что предполагался запуск на мобильных телефонах, для которых вместе со средствами разработки почему-то не поставляют стандартную библиотеку (как, например, Symbian).
На C++ не пишу, но подумай сам, что будет, если захватить лямбдой переменную ссылающуюся на динамически выделенную память(кто, а главное когда, должен будет эту память освободить?). Во всех языках с замыканиями, что я знаю, есть GC. В C++ же придётся решать такие вещи в ручную.
Звучит несколько субъективно, не находите? Вы говорите что С++ нужен, потому что вы его уже используете - не находите причинно-следственных нестыковок?
ООП там просится
Посмотрите на реализацию Gtk+ - там ООП, основанное на чистом С. Разница между ним и кодом на С++ в том, что к нему замечательно строить интерфейсы (поэтому биндинги к Gtk есть под любой сколько нибудь популярный язык), плюс читабельность, наглядность, итд.
Не нахожу. Я его использую потому что мне это удобно + никто не умеет писать новые задачи в моей области (ну из тех кого я знаю) с такой скоростью как я. Если бы кто нить появился пишущий на том же уровне скажем на фортране я б к нему прибежал и попросил показать, но таких нету;-)
Посмотрите на реализацию Gtk+ - там ООП, основанное на чистом С
Ище раз - мне нужны шаблоны. В С есть шаблоны? При импорте в питон для меня существенно что все методы и данные инкапсулированы в одном классе. В С-стайл мне придется совершать кучу ненужных движений -> скорость разработки упадет.
На C++ не пишу, но подумай сам, что будет, если захватить лямбдой переменную ссылающуюся на динамически выделенную память(кто, а главное когда, должен будет эту память освободить?).
man подсчет ссылок. man boost::shared_ptr. Кстати, в C++0x он есть в стандартной библиотеке.
Я прекрасно знаю о существовании умных указателей. Вот только их наличие не гарантирует, что их будут применять. Думаю спорить об этом не имеет смысла, т.к. через 2-3 года(или сколько там будет нужно, чтобы C++0x влился в массы) мы увидим результаты по кол-ву тредов в Development.
Посмотрите на реализацию Gtk+ - там ООП, основанное на чистом С. Разница между ним и кодом на С++ в том, что к нему замечательно строить интерфейсы (поэтому биндинги к Gtk есть под любой сколько нибудь популярный язык), плюс читабельность, наглядность, итд.
Толсто. Код GObject содержит кучу лишних телодвижений, которые в C++ никогда не пришлось бы делать.
PS. Единственный удобный биндинг для компилируемого языка для Gtk+, который я юзал - как ни странно, Gtk# (ибо обычный Gtk+ плох из-за реализации ООП на языке, не поддерживающем ООП, а gtkmm довольно крив).
> что будет, если захватить лямбдой переменную ссылающуюся на динамически выделенную память
Лямбды тут ни при чём. Просто это ещё один способ наступить на старые добрые грабли. Например, можно неявно для себя сохранить указатель в каком-нибудь объекте.
Является ли замыкание в c++0x объектом первого рода? Когда будет инкрементировано число ссылок на разделяемый объект, при создании замыкания или при его вызове? Когда оно будет декрементировано?
Задача лиспоориентирована, и на ней лисп уделает всех. На плюсах подобное нереализуемо по-человечески из-за статической типизации. Далее в примере, дабы не загромождать код лишними шаблонами и извращениями с типизацией, используется boost::any.
#include <boost/any.hpp>
#include <functional>
#include <iostream>
using namespace std;
using namespace boost;
function<any (bool)> cons(any head, any tail)
{
return [head, tail](bool head_t) -> any
{
return head_t ? head : tail;
};
}
any car(any lamb)
{
return any_cast<function<any (bool)> >(lamb)(true);
}
any cdr(any lamb)
{
return any_cast<function<any (bool)> >(lamb)(false);
}
int main()
{
auto cons_var = cons(1, cons(2, cons(3, cons(4, cons(5, nullptr)))));
cout << any_cast<int>(car(cons_var)) << '\n';
cout << any_cast<int>(car(cdr(cons_var))) << '\n';
}
Потом, если будет не лень, запощу версию с подсчетом ссылок, как в лиспе.