Каким должен быть С++?
, Ваше мнение
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
Каким должен быть С++?
, Ваше мнение
|
Сообщ.
#1
,
|
|
|
|
1. Недавно прочитал мнение о том, что this должен быть ссылкой, а не указателем.
2. Давно читал о том, что оператор "->" можно ( нужно ) заменить на ".". 3. От себя добавлю, что конструкции struct и class во многом совпадают, поэтому можно либо что-то из них убрать, либо сделать их более разными ( например, запретить в struct функции-члены ). Я думаю, что лучше оставить один class. А ещё лучше заменить его на type. Что ещё можно поменять? |
|
Сообщ.
#2
,
|
|
|
|
Для начала стоит взглянуть на D. Может быть все уже убрано до нас.
|
|
Сообщ.
#3
,
|
|
|
|
Совместимым с C++1x
|
|
Сообщ.
#4
,
|
|
|
|
Цитата prografix @ Что ещё можно поменять? Ничего из вышеперечисленного. Нет обратной совместимости. |
|
Сообщ.
#5
,
|
|
|
|
Цитата Нет обратной совместимости. Наверно надо было указать в первом сообщении, что совместимость нужно игнорировать. |
|
Сообщ.
#6
,
|
|
|
|
Цитата prografix @ Наверно надо было указать в первом сообщении, что совместимость нужно игнорировать. Тогда это будет не С++, а какой-нить E или какие там буквы остались еще свободны? |
|
Сообщ.
#7
,
|
|
|
|
Вот так D и получился.
|
|
Сообщ.
#8
,
|
|
|
|
Все три известных мне улучшения С++ ( Java, C#, D ) на мой взгляд оказались ухудшенными вариантами С++. Хотя по идее там должны быть и удачные изменения. Какие? Сам я давно смотрел эти языки, деталей не помню.
|
|
Сообщ.
#9
,
|
|
|
|
Java и C# никогда не позиционировались как «улучшенный C++».
|
|
Сообщ.
#10
,
|
|
|
|
Цитата prografix @ Думаю, что очень важна хорошая/удобная визуализация. Примеры:Что ещё можно поменять? 1.Вместо писанины y = sqrt(x) мы бы видели рисования корня над 'x' и далее, если надо. 2.Чтобы в записи "y = ++p[i];" был понятен=виден порядок действий. 3.Всякие goto рисовались бы полукруглыми путём со стрелками, если недалеко ведут. 4.Чтобы в for'е можно было написать: "for(a=0, int i=2; i<9; a++)" 5.Чтобы можно было: a[2..4] = {7,1,-5}; Ну или как-то так. 6.Чтобы неравенство можно было рисовать значком уникода ≠, а не городить непонятное многим "!=". |
|
Сообщ.
#11
,
|
|
|
|
Славян, пп.4,5 поддерживаю. Хотя в п.4 имеется некоторая неоднозначность. Как понимать такую запись?
![]() ![]() for (int i = 0, j = 10; i < j; ++i) А остальное можно средствами среды организовать. |
|
Сообщ.
#12
,
|
|
|
|
Цитата Славян @ Вместо писанины y = sqrt(x) мы бы видели рисования корня над 'x' и далее, если надо. Цитата Славян @ .Всякие goto рисовались бы полукруглыми путём со стрелками, если недалеко ведут. Цитата Славян @ Чтобы неравенство можно было рисовать значком уникода ≠, а не городить непонятное многим "!=". И как ты себе представляешь редактирование такого файла? Добавлено Цитата amk @ Кстати, а сейчас так писать можно? Можно, объявляются обе. |
|
Сообщ.
#13
,
|
|
|
|
Славян, тут язык обсуждают вообще-то.
amk, обе. Имя типа делает первое выражение заголовка for() определением, поэтому , интерпретируется как разделитель определяемых сущностей, а не как операция ,. |
|
Сообщ.
#14
,
|
|
|
|
Тогда пункт 4 будет противоречить существующему синтаксису. А вот групповое присваивание не помешало бы. И может присваивание части массива. Привык уже в питоне без временных переменных обходиться:
![]() ![]() a, b = b, a # Обмен значениями a, b = b + a, a # при вычислении чисел Фибоначчи a, b = b, a%b # алгоритм Эвклида x, y = x*c - y*s, y*c + x*s # поворот вектора |
|
Сообщ.
#15
,
|
|
|
|
Цитата Qraizer @ Извините. Возможно, я как-то по-своему, по-детски понял первое сообщение. Славян, тут язык обсуждают вообще-то. |
|
Сообщ.
#16
,
|
|
|
|
Цитата amk @ Тогда пункт 4 будет противоречить существующему синтаксису. А вот групповое присваивание не помешало бы. И может присваивание части массива. Привык уже в питоне без временных переменных обходиться: ![]() ![]() a, b = b, a # Обмен значениями a, b = b + a, a # при вычислении чисел Фибоначчи a, b = b, a%b # алгоритм Эвклида x, y = x*c - y*s, y*c + x*s # поворот вектора Тут тоже будет противоречие. Т.к. сейчас в ![]() ![]() int x, y = foo(); результат foo не имеет никакого отношения к x, а инициализирует только y. |
|
Сообщ.
#17
,
|
|
|
|
Цитата OpenGL @ Очень плохо представляю, даже отвратительно. Согласен, что тут "красота для глаз" сталкивается в войне с "удобством для рук". Цитата Славян @ 1.Вместо писанины y = sqrt(x) мы бы видели рисования корня над 'x' и далее, если надо. Цитата Славян @ 3.Всякие goto рисовались бы полукруглыми путём со стрелками, если недалеко ведут. Цитата Славян @ 6.Чтобы неравенство можно было рисовать значком уникода ≠, а не городить непонятное многим "!=". И как ты себе представляешь редактирование такого файла? |
|
Сообщ.
#18
,
|
|
|
|
Цитата D_KEY @ Синтаксис питона для C++ не подойдёт. В питоне запятая является просто перечислением, и сама по себе формирует кортеж. А в С++ запятая является операцией, вычисляющей и отбрасывающей результат левого от неё выражения. То есть без некоторого обрамления не обойтись. Подошла бы запись вродеТут тоже будет противоречие. ![]() ![]() {a, b} = {b, foo(a)}; И в объявлениях множественное присваивание смысла обычно не имеет. |
|
Сообщ.
#19
,
|
|
|
|
Цитата Славян @ Ты сначала вспомни зачем были введены диграфы и триграфы. Вместо писанины y = sqrt(x) мы бы видели рисования корня над 'x' и далее, если надо. ... Чтобы неравенство можно было рисовать значком уникода ≠, а не городить непонятное многим "!=". |
|
Сообщ.
#20
,
|
|
|
|
Цитата amk @ Да. Выражение может быть или обычным, или определением, но целиком либо тем, или иным. Делать или нет определениями отдельные его операнды синтаксис выражений не позволяет. Но ты можешь произвольное выражение_не_определение замешать в инициализирующее значение выражения-определения:Тогда пункт 4 будет противоречить существующему синтаксису. ![]() ![]() for (int i = (j = 10, 0); i < j; ++i) |
|
Сообщ.
#21
,
|
|
|
|
Та надо вообще отказаться от for в текущем виде и добавить интервалы =)
![]() ![]() // вместо for (int i = (j = 10, 0); i < j; ++i) // это for (int i = 10 in [0..j = i]) // вместо for (int i = 0; i < j; i+=5) // это for (int i in [0..j] by 5) |
|
Сообщ.
#22
,
|
|
|
|
Та оставить for как есть, бог с ним. Лучше выпилить switch, тот вообще неструктурный даже.
![]() ![]() switch(...) { case ...: if(...){/* ... */ case ...: /* ... */ case ...:;} else {/* ... */ case ...: /* ... */ break; case ...: /* ... */} } |
|
Сообщ.
#23
,
|
|
|
|
Цитата prografix @ 1. Недавно прочитал мнение о том, что this должен быть ссылкой, а не указателем. В Java с C# прочитал? Цитата prografix @ 2. Давно читал о том, что оператор "->" можно ( нужно ) заменить на ".". Зочем? -> это для указателей, . - Для обычной семантики по значению. Если Заменить -> на . то как работать с указателями? Или выбросить их? Цитата prografix @ 3. От себя добавлю, что конструкции struct и class во многом совпадают, поэтому можно либо что-то из них убрать, либо сделать их более разными ( например, запретить в struct функции-члены ). Я думаю, что лучше оставить один class. А ещё лучше заменить его на type. Структура более лаконична, если нужно написать интерфейс. Не нужно пихать всякие public, и смотрится красиво. Не нужно. и type в топку. |
|
Сообщ.
#24
,
|
|
|
|
Serafim, держи. Смотреть надо на функцию main.
То, что выше - это "пережитки" C++11. В C++14 код будет сильно проще. |
|
Сообщ.
#25
,
|
|
|
|
Цитата Flex Ferrum @ Serafim, держи. Смотреть надо на функцию main. То, что выше - это "пережитки" C++11. В C++14 код будет сильно проще. Но это ведь маразм ради какой то сахарной фичи городить такой огород )) |
|
Сообщ.
#26
,
|
|
|
|
Цитата Wound @ Но это ведь маразм ради какой то сахарной фичи городить такой огород )) Так вот я и говорю - в C++14 будет много проще. |
|
Сообщ.
#27
,
|
|
|
|
Цитата Flex Ferrum @ Так вот я и говорю - в C++14 будет много проще. А сейчас как выходит стандарты? Каждый год? Или у них просто есть конечная цель и они ее реализуют? А то раньше както редко выходили новые стандларты. А щас чуть ли не каждый год-два |
|
Сообщ.
#28
,
|
|
|
|
Цитата Wound @ А сейчас как выходит стандарты? Сейчас вот "баг-фикс" в виде C++14, а потом будет С++17 c |
|
Сообщ.
#29
,
|
|
|
|
Цитата Flex Ferrum @ Сейчас вот "баг-фикс" в виде C++14, а потом будет С++17 c блэкджеком полиморфными аллокаторами и лайт-концептами. А есть компилятор уже с полностью реализованым стандартом что они приняли в 11 году? Пусть даже с какими то багами? А то я както давно уже пропустил тему. Добавлено gcc последний например ? Или это они его все пилить до 17 года будут? |
|
Сообщ.
#30
,
|
|
|
|
Цитата Wound @ gcc последний например ? Full-featured C++11 - это gcc 4.8 и, ЕМНИП, clang 3.3. clang 3.4 поддерживает уже почти все фишки C++14. |
|
Сообщ.
#31
,
|
|
|
|
Ясно, спасибо. Надо пощупать. А то у нас на работе все на старом сидим. Единственное что до студии 12 проапгрейдились.
|
|
Сообщ.
#32
,
|
|
|
|
Цитата Flex Ferrum @ То, что выше - это "пережитки" C++11 только 98, только хардкор! Во имя void main Добавлено Цитата Wound @ Но это ведь маразм ради какой то сахарной фичи городить такой огород )) Между прочим сахарный огород начинает потихоньку вытеснять обычный Скрытый текст Намёк на JS vs Coffee |
|
Сообщ.
#33
,
|
|
|
|
Цитата Serafim @ только 98 void main Взаимоисключающие параграфы. |
|
Сообщ.
#34
,
|
|
|
|
Цитата D_KEY @ Взаимоисключающие параграфы. int main и 98 взаимоисключаются, а void как раз самое оно |
|
Сообщ.
#35
,
|
|
|
|
Serafim учит D_KEY C++
|
|
Сообщ.
#36
,
|
|
|
|
MyNameIsIgor, естественно, яж плюсов не знаю, самое время учить
|
|
Сообщ.
#37
,
|
|
|
|
Цитата Serafim @ int main и 98 взаимоисключаются, а void как раз самое оно Серьёзно? Цитата 3.6.1 Main function [basic.start.main] ... 2 An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main: ![]() ![]() int main() { /* ... */ } and ![]() ![]() int main(int argc, char* argv[]) { /* ... */ } ... |
|
Сообщ.
#38
,
|
|
|
|
Serafim наверное считает так из-за влияния древнего vc6.0, который умудрялся на int main() выдавать варнинг а-ля "main должна возвращать void"
|
|
Сообщ.
#39
,
|
|
|
|
нет, Turbo С++, ну да ладно
|
|
Сообщ.
#40
,
|
|
|
|
В C++ мне недостает ровно одной вещи: GUI-либ на уровне стандарта
Прямым кандидатом на эту вакансию я вижу Qt. Кто знает, может, после буста очередь дойдет и до него |
|
Сообщ.
#41
,
|
|
|
|
Цитата B.V. @ Прямым кандидатом на эту вакансию я вижу Qt. Почему? Qt не придерживается философии плюсов - error() вместо нормальных исключений, использование повсюду голых указателей, невозможность нормально сделать шаблонные виджеты, неясно, как совместить модель потоков и объектов Qt с плюсовой, да и вообще больше походит на библиотеку Си с классами, чем плюсовую. |
|
Сообщ.
#42
,
|
|
|
|
Цитата B.V. @ GUI-либ на уровне стандарта Нет уж, не надо. Добавлено Цитата B.V. @ Прямым кандидатом на эту вакансию я вижу Qt. Кто знает, может, после буста очередь дойдет и до него Ну так используй Qt, зачем в стандарт гуй пихать? Добавлено У Страуструпа, кстати, в относительно новой книге для новичков про гуй рассказывается. Но там не Qt, там fltk |
|
Сообщ.
#43
,
|
|
|
|
Цитата B.V. @ В C++ мне недостает ровно одной вещи: GUI-либ на уровне стандарта Зачем GUI на микроконтроллерах? |
|
Сообщ.
#44
,
|
|
|
|
Цитата Мяут-Настоящий @ Ну как же, как! Чтобы открываем мы системник или ещё какой блок, а там в каждой микросхемке микроэкранчик и показывает ТТХ или другую DEBUG-инфу. Лепота ж! Согласны? Зачем GUI на микроконтроллерах? |
|
Сообщ.
#45
,
|
|
|
|
Цитата Serafim @ Та надо вообще отказаться от for в текущем виде и добавить интервалы =) ![]() ![]() // вместо for (int i = (j = 10, 0); i < j; ++i) // это for (int i = 10 in [0..j = i]) // вместо for (int i = 0; i < j; i+=5) // это for (int i in [0..j] by 5) ![]() В математике есть интервалы включающие концы и нет. Если конец включается, то это квадратная скобка, иначе - круглая. В такой записи будет: ![]() ![]() for (int i in [0..j) by 5) |
|
Сообщ.
#46
,
|
|
|
|
prografix в программировании обычно двумя или тремя точками обозначается =)
Добавлено Если в языке есть интервалы конечно Добавлено Насколько помню это Python, Ruby, Delphi, Coffee |
|
Сообщ.
#47
,
|
|
|
|
В Python нет интервалов, там есть генераторы:
![]() ![]() for i in range(20, 80, 10): print i Но Flex Ferrum нечто подобное выше уже выложил |
|
Сообщ.
#48
,
|
|
|
|
![]() ![]() #include <boost/range/counting_range.hpp> using namespace boost; ... for (auto i : counting_range(0, 10)) ... |
|
Сообщ.
#49
,
|
|
|
|
Мяут-Настоящий, вообще-то range в Python вовсе не генератор, а обычный контейнер. Во 2-х это функция, возвращающая список значений, а в 3-х отдельный класс, являющийся неизменяемым контейнером, содержащим этот список. В Python активно применяются итераторы, являющиеся по сути генераторами, перебирающими объекты контейнера. И существуют виды,
А на счёт диапазонов ты верно подметил, в Python'е их действительно нет и не предвидится. |
|
Сообщ.
#50
,
|
|
|
|
Да, я вечно его с xrange путаю. Последний как раз-таки генератор.
|
|
Сообщ.
#51
,
|
|
|
|
Оффтоп:
Я вот одного в Python'е не понял, почему срезы (slice, a[b:e:s]) не сделали отображениями. |
|
Сообщ.
#52
,
|
|
|
|
Цитата amk @ почему срезы (slice, a[b:e:s]) не сделали отображениями. А как их сделали? И что значит "сделать срезы отображениями"? |
|
Сообщ.
#53
,
|
|
|
|
korvin, срез с синтаксисом - это не отображение, а копия списка. Хотя сами объекты копируются по ссылке, похоже.
|
|
Сообщ.
#54
,
|
|
|
|
Цитата Мяут-Настоящий @ Хотя сами объекты копируются по ссылке, похоже. "Копируются" и "по ссылке" -- взаимоисключающие вещи. =) Но в целом, я вроде понял о чем ты. |
|
Сообщ.
#55
,
|
|
|
|
Копируется ссылка, конечно.
|
|
Сообщ.
#56
,
|
|
|
|
|
|
Сообщ.
#57
,
|
|
|
|
Цитата Axis @ Да и уже избавиться от include и от разбития по .h/.cpp файлам))). И заменить это на аналог using .NET или import JAVA. Чтобы библиотека содержала всю необходимую информацию для своего использования. N4214 Цитата Axis @ Уже наконец-то полноценные концепты, а не костыли на SFINAE. N4205 Цитата Axis @ Расширенный RTTI, чтобы в рантайме можно было получить информацию о методах, указатели и т.д. N4111 Цитата Axis @ Аттрибуты подобные .NET, по сути расширение предыдущего пункта дополнительной метаинформацией N3984 |
|
Сообщ.
#58
,
|
|
|
|
Мой список
![]() Да, по поводу рефлексии - никакого run-rime, всё должно быть compile-time, imho. |
|
Сообщ.
#59
,
|
|
|
|
|
Сообщ.
#60
,
|
|
|
|
Цитата Flex Ferrum @ Я не читал, а быстро пролистал, и мне кажется, что они stackless, как у Криса в asio на макросах. |
|
Сообщ.
#61
,
|
|
|
|
Цитата MyNameIsIgor @ всё должно быть compile-time, imho Это не всегда возможно. Каким образом процедура test может получить фактический класс значения переменной x из статической информации о ней? |
|
Сообщ.
#62
,
|
|
|
|
Цитата korvin @ Цитата MyNameIsIgor @ всё должно быть compile-time, imho Это не всегда возможно. Каким образом процедура test может получить фактический класс значения переменной x из статической информации о ней? Да, возможностей меньше, но рефлексия во время исполнения слабо вяжется с нишей языка. Если они так сильно нужны, то можно взять другой язык. Ну, а test в данном случае можно сделать шаблоном. |
|
Сообщ.
#63
,
|
|
|
|
Цитата MyNameIsIgor @ Ну, а test в данном случае можно сделать шаблоном Каким образом это поможет, если я захочу применить ее (в цикле) к коллекции [Parent*], в которой могут находиться элементы любого дочернего класса? По-моему было бы неплохо иметь возможность создавать (локальные, временные) расширения классов без необходимости в рантайме создавать копию коллекции (в отличие от использования субклассов), типа того: ![]() ![]() extension Test { class Parent { public: virtual void describe() { ^describe(); // вызов оригинального метода Parent::describe cout << " extension Test"; } }; class Child { public: virtual void describe() { cout << "Child extension Test"; } }; }; void test(vector<Parent> xs) { extend xs : Test; for (auto x : xs) { x->describe(); cout << endl; } } Только я не представляю как это можно (или насколько сложно) сделать потокобезопасно. |
|
Сообщ.
#64
,
|
|
|
|
Цитата korvin @ Каким образом это поможет, если я захочу применить ее (в цикле) к коллекции [Parent*], в которой могут находиться элементы любого дочернего класса? В случае run-time созданной коллекции, конечно, никаким. Но с помощью статической рефлексии можно сгенерировать информацию, которая будет использовать во время исполнения. Это потребует лишних телодвижений от программиста со всякой регистрацией и тому подобным, но лучше соответствует духу языка. Цитата korvin @ По-моему было бы неплохо иметь возможность создавать (локальные, временные) расширения классов без необходимости в рантайме создавать копию коллекции (в отличие от использования субклассов), типа того: Должен сказать, что не осилил что это и о чём ты хочешь сказать :-) |
|
Сообщ.
#66
,
|
|
|
|
Цитата MyNameIsIgor @ Должен сказать, что не осилил что это и о чём ты хочешь сказать :-) Ну вот смотри, вернемся к цели использования рефлексии, допустим в примере с test это могло бы быть что-то вроде: ![]() ![]() class Parent { public: virtual void describe() { cout << "Parent"; } }; class Child : public Parent { public: virtual void prefix() { cout << "\t"; } virtual void describe() { cout << "Child"; } }; void test(Parent *x) { // синтаксис условный if (RTTI::supports(x, RTTI::class<Child>())) RTTI::cast<Child>(x)->prefix(); x->describe(); cout << endl; } что с точки зрения ООП как бы не очень хорошо, ведь для такого и существуют классы (точнее ad-hoc полиморфизм и data directed programming), чтобы специализированный код выбирался автоматически по типу данных без всяких if'ов. Вообще более общий случай -- проверка наличия метода void prefix(), но не будем усложнять. Можно создать субкласс Child ![]() ![]() class ChildExt : public Child { public: virtual void describe() { prefix(); Child::describe(&this); } }; или прокси ![]() ![]() class ChildProxy : public Child { private: Child *original; public: virtual void describe() { original->prefix(); original->describe(); } virtual Child* getOriginal() { return original; } }; но тут есть проблемы: нужно правильно найти места для преобразования (мы не можем преобразовать коллекцию, т.к. там уже статическая информация потеряна и мы возвращаемся к RTTI), нужно как-то вернуть все обратно, ведь преобразованные элементы скорее всего необходимо передавать дальше. Плюс накладные расходы на все это в рантайме. Вот если бы мы могли локально, временно изменять классы, не затрагивая сами объекты, тогда бы все эти проблемы были бы решены. ![]() ![]() extension Test { class Child { public: virtual void describe() { prefix(); ^descibe(); // original } } }; Тогда бы test осталась бы максимально простой, никаких "дум" где и как вставить преобразование объектов Child к ChildExt или ChildProxy, почти никаких накладных расходов на рантайм ![]() ![]() void test(Parent *x) { x->describe(); cout << endl; } ... extend Test; // область действия определяется как и для всего остального -- по области видимости for (Parent *x : xs) test(x); ... Вообще это похоже на динамические переменные CL, только применяется к классам. |
|
Сообщ.
#67
,
|
|
|
|
Цитата MyNameIsIgor @ Я попробовал. Два полиморфных вызова на каждый позднесвязываемый параметр. Думаю, ещё эффективнее не выйдет. Библиотеками такое не реализовать, тем более эффективно. Добавлено Ладно, будет сам мой дембельский аккорд. Всё равно за три дня не успею под C++11 перенести, раз до сих пор так и не собрался. А скоро уже и не надо будет, ибо будут испаропки. |
|
Сообщ.
#68
,
|
|
|
|
Исправил. Добавлено Цитата Qraizer @ Я попробовал. Два полиморфных вызова на каждый позднесвязываемый параметр. Думаю, ещё эффективнее не выйдет. Я помню их - там необходима регистрация в одном месте, что неприемлемо. Это во-первых. Во-вторых, если мы оставляем подобную регистрацию, то эффективнее можно по тому же принципу, что описан у Страуструпа. |
|
Сообщ.
#69
,
|
|
|
|
Эффективнее можно при поддержке языка. Я говорил о библиотеке.
|
|
Сообщ.
#70
,
|
|
|
|
Цитата Qraizer @ Эффективнее можно при поддержке языка. Я говорил о библиотеке. Я тоже. Таблицу, про которую пишет Бьярн, можно сформировать, если регистрация всего происходит в одном месте. |
|
Сообщ.
#71
,
|
|
|
|
korvin, правильно ли я понимаю, что таким "расширением класса" ты в данном случае говоришь "для всех Child в этой коллекции вызови prefix перед describe"?
|
|
Сообщ.
#72
,
|
|
|
|
Цитата MyNameIsIgor @ правильно ли я понимаю, что таким "расширением класса" ты в данном случае говоришь "для всех Child в этой коллекции вызови prefix перед describe"? Да. |
|
Сообщ.
#73
,
|
|
|
|
Цитата korvin @ Цитата MyNameIsIgor @ правильно ли я понимаю, что таким "расширением класса" ты в данном случае говоришь "для всех Child в этой коллекции вызови prefix перед describe"? Да. Ну, тогда это возможно реализовать. По семантике это как раз предложение от Страуструпа и Ко по мультиметодам ![]() ![]() ![]() void test(virtual Parent* p) { p->describe(); } void test(virtual Child* p) { p->prefix(); p->describe(); } for(Parent* p : vector) test(p); Конечно, решить общий случай проверки наличия метода с заданным именем и сигнатурой это не позволяет. |
|
Сообщ.
#74
,
|
|
|
|
Цитата MyNameIsIgor @ По семантике это как раз предложение от Страуструпа и Ко по мультиметодам Да, думаю, так лучше. Цитата MyNameIsIgor @ Конечно, решить общий случай проверки наличия метода с заданным именем и сигнатурой это не позволяет. Ну, мой огород этого тоже не позволяет, но само по себе решение этой небольшой проблемы с test покрывает 99% случаев использования рантайм-рефлексии, ИМХО. Добавлено Вообще для упрощения можно было бы ограничиться для начала не мультиметодами, а просто "внешними" методы. |
|
Сообщ.
#75
,
|
|
|
|
Цитата korvin @ Вообще для упрощения можно было бы ограничиться для начала не мультиметодами, а просто "внешними" методы. Имеешь в виду возможность добавления в класс методов без его изменения? Типа этого? Просто это рассматривается как изменение на уровне синтаксиса. А документ по мультиметодам скорее сосредоточен на способе их реализации, и для одного параметра вызов foo(bar) полностью эквивалентен существующим виртуальным методам bar.foo() |
|
Сообщ.
#76
,
|
|
|
|
Создал тему с мультиметодами в Общих вопросах. Кому интересно, прошу милости.
|
|
Сообщ.
#77
,
|
|
|
|
Цитата MyNameIsIgor @ Имеешь в виду возможность добавления в класс методов без его изменения? В целом да, только локально, а не глобально, т.к. иначе это будет не адекватно работать в многопоточном коде. Цитата MyNameIsIgor @ Типа этого? По беглому просмотру -- да, типа этого. |
|
Сообщ.
#78
,
|
|
|
|
Цитата korvin @ В целом да, только локально, а не глобально Ну, в плюсах этот унифицированный синтаксис вызова методов/функций (если он появится) в плане локальности будет таким же, как и существующие сейчас функции - какие имена видим, такие и можем вызвать. Цитата korvin @ иначе это будет не адекватно работать в многопоточном коде Ну, у нас не динамика типа CL и Ruby На самом деле никаких структур данных, относящихся к классу, во время исполнения изменяться не будет, всё это происходит при компиляции/линковке - вставка адресов невиртуальных функций и заполнение таблиц виртуальных функций. |
|
Сообщ.
#79
,
|
|
|
|
Вот интересно, есть ли какой-нибудь способ узнать мнение серьёзных товарищей касательно моих мультиметодов? Ну или если помечтать, чтобы Бьярн их в сравнение включил...
|
|
Сообщ.
#80
,
|
|
|
|
Цитата Qraizer @ Вот интересно, есть ли какой-нибудь способ узнать мнение серьёзных товарищей касательно моих мультиметодов? Ну или если помечтать, чтобы Бьярн их в сравнение включил... У Комитета нет почтового ящика для приема заявок от населения? =) |
|
Сообщ.
#81
,
|
|
|
|
Цитата Qraizer @ Вот интересно, есть ли какой-нибудь способ узнать мнение серьёзных товарищей касательно моих мультиметодов? Ну или если помечтать, чтобы Бьярн их в сравнение включил... Эммм.... Если возьмёшься переписать свой текст на англицкий - могу забросить в список рассылки ACCU. Там более-менее серьёзные товарищи тусят. |
|
Сообщ.
#82
,
|
|
|
|
Когда ж мне этим заниматься? Я на этот-то русский потратил 9 часов |