
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 8 9 [10] 11 12 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#136
,
|
|
|
Цитата archimed7592 @ Я вот смотрю на приводимые тобою примеры и совсем не понимаю, что ты ими показать пытаешься... Учитывая, что в трех из них написан бред, а также судя по остальному тексту, можно предположить, что их автор - троль ![]() |
![]() |
Сообщ.
#137
,
|
|
Я чё та прифигел... Неужели аффтар прав и здесь будет именно такой ответ?
Нет компилера под рукой, подскажите, а ? ![]() ![]() class A { public: virtual void func() { std::cout<<"This is A class"<<std::endl; } }; class B: public A { public: virtual void func() { std::cout<<"This is B class"<<std::endl; } }; ... A a; a.funck(); B b; b.funck(); This is A class This is A class |
Сообщ.
#138
,
|
|
|
Цитата Hsilgos @ Неужели аффтар прав и здесь будет именно такой ответ? Нет, аффтар не прав. Он явно не проверял код перед отправкой поста. Как, впрочем, и в следующем примере. Код ![]() ![]() bool validResult = false; int i = -1; while(!validResult) { i ++; switch(i) { case 0: break; case 1: break; case 2: break; case 3: validResult = 1; break; } std::cout << "i = " << i << ", validResult = " << validResult << std::endl; } std::cout << "Loop finished" << std::endl; честно отрабатывает положенные 4 итерации. По этому с какого перепугу автор поста решил, что break внутри switch прерывает внешний цикл - известно только автору... |
![]() |
Сообщ.
#139
,
|
|
Ну с шаблонами - ладно, шаблоны это, можно сказать, отдельный подъязык в языке С++. (По моему скромному имхо, язык программирования должен стремиться к такому виду.)
Цитата На последнем заседании комитета по стандартизации среди всего прочего в стандарт C++0x включили поддержку lambda-функций. Лямбда функции тоже ничё, давно пора. Хотя для восприятия это будет сложновато. И, думаю, будет рассадник копипаста у нерадивых программистов. И да... какая теперь разница будет между ![]() ![]() for_each( v.begin(), v.end(), []( Widget& w ) { ... ... use or modify w ... ... } ); и ![]() ![]() for(iterator it = v.begin(),itEnd = v.end(); it != itEnd; ++it) { use or modify "*it"; } ??? ![]() Цитата В библиотеку STL добавлены односвязные списки Нафига? Меньше памяти? Цитата Также позволили в объявлении функции использовать auto вместо типа возвращаемого значения. В этом случае тип функции был определен по типу возвращаемго значения в "самом последнем" операторе return. Ключевое слово auto будет только для шаблонов или в любом месте использоваться? Для чего это вообще то нужно? Теперь при виде метода придется лезть внутр и смотреть, какой же тип возвращает функция... Да и тот будет выбираться из какого-то непонятного правила "последнего return". По-моему, это плохо. Убедите меня в обратном =)) Нда, я как посмотрю, язык С++ становится всё сложнее и сложнее. Владеть полностью С++ в будущем будет означать принадлежность к касте этаких тру-бородатых, заросших программистов в очках ![]() У меня неоднозначное отношение к этому. Не приведет ли это к смерти языка, как очень сложного? Добавлено Цитата Из-за остутвия finally приходится использовать смарты, которые добавляют к программе лишних 100-200 КБ кода, даже если в принципе нет особой нужды в подсчете ссылок и т.п. А я вот всё пытаюсь автоматизировать такие вещи. Всегда может оказаться место, где досмотришь. не удалишь, не освободишь, а потом ищешь трудноуловимые ошибки ![]() Тем более смарты иногда очень существенно уменьшают код (где-то слышал термин, опимывающий "полезность" кода на количество строчек...). Ненадо заботится, что при вызоде из функции в 4-х местах забудешь освободить ресурсы. Цитата char a[1]; a[10] = 100; Сам себе противоречишь. Хочешь, чтобы С++ небыл похож на С и в то же время используешь С-шные rконструкции. vector + vector::at тебе в руки. |
![]() |
Сообщ.
#140
,
|
|
Цитата Hsilgos @ И да... какая теперь разница будет между Первый вариант более гибкий. Цитата Hsilgos @ Ключевое слово auto будет только для шаблонов или в любом месте использоваться? Ключевое слово auto имеет весьма посредственное отношение к шаблонам... Цитата Hsilgos @ Для чего это вообще то нужно? Для гибкости. Знаешь как в C# удобно пользоваться var?(IIRC, начиная с 3.0 появилось) Цитата Hsilgos @ Теперь при виде метода придется лезть внутр и смотреть, какой же тип возвращает функция... Это самое вкусное - концептуальное программирование. Ты не знаешь какого типа возвращённый тебе объект, но ты знаешь концепт, реализуемый этим объектом. Концепт - это такой контракт между библиотекой и её пользователем. К примеру, можно встретить в стандарте в описании STL(iterator requirements, sequence container requirements and so on), в бусте(threads, mutex, etc.). А с появлением валидируемых концептов в самом языке это перестаёт быть пустыми словами. Ещё большую гибкость предоставляют концепт-мапы, позволяющие создавать адаптеры от одного концепта к другому. |
Сообщ.
#141
,
|
|
|
Цитата Hsilgos @ И да... какая теперь разница будет между Кхм-кхм... Читаем на этой странице: GCC 4.3.2 changes: Цитата An experimental parallel mode has been added. This is a parallel implementation of many C++ Standard library algorithms, like std::accumulate, std::for_each, std::transform, or std::sort, to give but four examples. These algorithms can be substituted for the normal (sequential) libstdc++ algorithms on a piecemeal basis, or all existing algorithms can be transformed via the -D_GLIBCXX_PARALLEL macro. Теперь ответ на твой вопрос очевиден. ![]() Цитата Hsilgos @ И, думаю, будет рассадник копипаста у нерадивых программистов. С одной стороны, да. С другой - открывает новые возможности. Вот тебе задачка. Тебе нужно протестировать как один класс работает с объектами другого класса - в правильном ли порядке методы вызываются и все такое. Если взаимодействие построено на базе интерфейсов, то тебе ничего не стоит написать такую реализацию класса, с которым производится взаимодействие, что она будет вызывать делегаты. ![]() ![]() struct ISomeInterface { public virtual void Foo1() = 0; public virtual void Foo2() = 0; public virtual void Foo3() = 0; }; //... class TestClassThunk : public ISomeInterface { public: std::function<void ()> FuncDelegate; FuncDelegate OnFoo1; FuncDelegate OnFoo2; FuncDelegate OnFoo3; void Foo1() {OnFoo1();} void Foo2() {OnFoo2();} void Foo3() {OnFoo3();} }; //... void TestSomething() { TesteeClass target; TestClassThunk tester; bool foo1_called = false; tester.OnFoo1 = []() {foo1_called = true;} target.SomeMethod(tester); assert(foo1_called); } Существующими методами ты такое напишешь с бОльшим трудом. Без boost::lambda/boost::phoenix - так вообще никак. Цитата Hsilgos @ Для чего это вообще то нужно? Чтобы вместо: ![]() ![]() std::map<std::string, std::vector<int> >::const_iterator p = m_Map.begin(); писать ![]() ![]() auto p = m_Map.cbegin(); |
![]() |
Сообщ.
#142
,
|
|
Цитата typedef X::value_type value_type; void push(X& x, value_type value ) { x. push_back(value); } void pop(X& x) { x. pop_back(); } T top(const X& x) { return x.back(); } А чё, это нормально... вот это больше на brainfuck похоже ![]() ![]() typedef return_type(T::*MemFun)(const arg_type& v1); return_type ret = (obj->*MemFun)(val); ![]() |
Сообщ.
#143
,
|
|
|
Цитата Hsilgos @ вот это больше на brainfuck похоже Это еще не brainfuck... |
![]() |
Сообщ.
#144
,
|
|
Цитата Flex Ferrum @ Кхм-кхм... Читаем на этой странице: GCC 4.3.2 changes: Мухаха, сколько же после этого сломается кода, который делал расчёт на порядок вызова функтора ![]() |
Сообщ.
#145
,
|
|
|
Цитата archimed7592 @ Мухаха, сколько же после этого сломается кода, который делал расчёт на порядок вызова функтора ![]() Ну, тут уж народ сами себе злобные буратинки... ![]() |
![]() |
Сообщ.
#146
,
|
|
Цитата Flex Ferrum @ Чтобы вместо: std::map<std::string, std::vector<int> >::const_iterator p = m_Map.begin(); писать auto p = m_Map.cbegin(); Хм. Значит ли это, что теперь абсолютно люой тип можно булет описать как auto? Для таких задач хорошо использовался typedef Цитата Это еще не brainfuck Ну для нас с тобой - нет. А вот я как-то видел выражения лица у человека, который пишет на C# при виде этого кода. Он мне говорит, "Для меня это примерно каквот такой код #*&#HKkjh##@#" =) |
Сообщ.
#147
,
|
|
|
Хотя, нередко std::accumulate используется именно для последовательной сцепки элементов. В паралельном режиме результат, гм... непредсказуем...
![]() Добавлено Цитата Hsilgos @ Значит ли это, что теперь абсолютно люой тип можно булет описать как auto? Видимо. Цитата Hsilgos @ Для таких задач хорошо использовался typedef Ну, не всегда его использование полностью оправдано. Т. е. использовать typedef только для того, чтобы упростит текст программы (а не для введение нового псевдонима типа) - не есть гуд. |
![]() |
Сообщ.
#148
,
|
|
Цитата Hsilgos @ Хм. Значит ли это, что теперь абсолютно люой тип можно булет описать как auto? Что значит описать? auto - это вариант определиния переменной, аналогичный использованию deduced template parameter в аргументах ф-ции: ![]() ![]() template< class T > void foo(const T &arg) { // ... } ![]() Цитата Hsilgos @ Для таких задач хорошо использовался typedef typedef менее гибкий. См. какую возможно даёт auto: ![]() ![]() // представим, что у нас есть концепт string который обязывает // к наличию метода length() с соответствующей семантикой(и др. методов, ессно) // library code SomeLibrary::SomeStringImplementation getSomeValue(); // client code auto value = getSomeValue(); // год спустя вышла другая библиотека, предоставляющая намного более эффективную реализацию концепта string // library code YetAnotherLibrary::EffectiveStringImplementation getSomeValue(); // client code auto value = getSomeValue(); // не меняется Это предоставляет просто шикарные перспективы для проектирования чёрных ящиков за которыми, я считаю, будущее программирования. Концепты, в свою очередь - это очень эффективный(хотя бы по той причине, что они compile time) аналог интерфейсов. typedef, в свою очередь, придётся менять на стороне клиента. При выходе новой версии библиотеки, с новыми концептами, старые можно будет обернуть в концепт-мапы тем самым сохранив backward compatibility. |
![]() |
Сообщ.
#149
,
|
|
Не стал копировать весь пример...
Цитата bool foo1_called = false; tester.OnFoo1 = []() {foo1_called = true;} Это пример попахивает возвращением к глобальным переменным. ![]() Но в принципе суть я уловил, своё применение фишка найдет, иногда такое ой как надо ![]() |
![]() |
Сообщ.
#150
,
|
|
Цитата Hsilgos @ Это пример попахивает возвращением к глобальным переменным. ![]() Это зависит от программиста и от того, как он воспользуется предоставляемыми инструментами. |