LINUX.ORG.RU

Почему в C++ не запилят интроспекцию / рефлексию?

 ,


3

7

1. Успех Qt во многом благодаря его Meta Object Compiler.
2. 2013 год. В C++ нет зачатков рефлексии. Сериализация выполняется вручную...
3, 4... Приведите сами
А теперь вопрос знатокам: почему, [censored], это так трудно сделать?

смело бери другой ЯП, если тебе это нужно, плюсы - это всего-лишь продвинутый ассемблер

wota ★★
()

Рефлексия нужна только во время компиляции, и при наличии полноценной макросистемы. За рефлексию в рантайме надо убивать лопатой по яйцам.

В С++ свой подход, ничем не хуже чем макросы + рефлексия. При вычислении шаблонов информация о типе доступна.

anonymous
()

потому что для этого требуется адовый рантайм. И да, ради этого придётся выкинуть inline функции/методы, сделать классы объектами первого рода, да и вообще перепилить язык. Иди лучше на жабе пиши, а?

anonymous
()
Ответ на: комментарий от anonymous

При вычислении шаблонов информация о типе доступна.

при вычислении шаблонов много чего другого недоступно зато. Да и сами шаблоны - скорее грязный хак, чем часть языка.

anonymous
()

А теперь вопрос знатокам: почему, [censored], это так трудно сделать?

В «Дизайн и эволюция языка C++» Страуструп этот вопрос освещает. Если коротко, то: С++ есть под всякие разные микроконтроллеры, где интроспекция будет мешать (оверхед по памяти из-за требования рантайма), поэтому в C++ её не будет из коробки, а если кому надо - делайте в виде библиотеки\сторонней тулзы.

Там это чуть подробней изложено + контекст принятия именно такой позиции описан.

Norgat ★★★★★
()

Успех Qt

/0

anonymous
()
Ответ на: комментарий от anonymous

Иди лучше на жабе пиши, а?

Спасибо, нет.

nerdogeek
() автор топика
Ответ на: комментарий от Norgat

RTTI отключается. Можно было бы и рефлексию отключать специально для микроконтроллеров и микроволновок.

nerdogeek
() автор топика
Ответ на: комментарий от anonymous

при вычислении шаблонов много чего другого недоступно зато.

Чего лично тебе не хватает? В C++11, конкретно.

Да и сами шаблоны - скорее грязный хак, чем часть языка.

А в спецификации написано, что часть языка. Кому верить? Онанимному онанитеку с ЛОРа, или уважаемому комитету?

anonymous
()
Ответ на: комментарий от nerdogeek

Для начала объясни, на хера она тебе вообще нужна в рантайме?

anonymous
()
Ответ на: комментарий от anonymous

Можно пример сериализации и десериализации произвольной структуры в нужный вид? Например простейшее:

struct Point {
    int x;
    int y;
};

string serialize(const Point &p) { ... }
возвращает
"<Point><x>1</x><y>2</y></Point>"
ну и десериализация этого же в Point.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от anonymous

Чего лично тебе не хватает? В C++11, конкретно.

Обхода полей структур. В compile-time, естественно.

O02eg ★★★★★
()
Ответ на: комментарий от anonymous

Ну сгенерируй код метода serialize в компайл-тайме. На D, например, я представляю, как это сделать. Как это сделать на С++?

Для определённости пусть будет
[code]
template <class T>
string serialize(const T& obj) { ... }
[/code]

который в указанном виде выводит поля.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

На D, например, я представляю, как это сделать

покажи

wota ★★
()
Ответ на: комментарий от anonymous

Чего лично тебе не хватает? В C++11, конкретно.

например, проверки значения аргумента шаблона вместо его инстанциации. Знаешь, было бы круто написать один if и не копипастить весь код N раз. В D это нормально сделано, в C++ - через жопу.

anonymous
()
Ответ на: комментарий от anonymous

s/инстанциации/специализации/

anonymous
()

Успех Qt во многом благодаря его Meta Object Compiler

Ну это вы загнули...

А теперь вопрос знатокам: почему, [censored], это так трудно сделать?

Встречный вопрос к тебе: если это просто, что зачем ты тут сопли пускаешь - иди запили, чо. А если сложно, вопрос снимается сам собой.

Если серьезно - нафейхоа тянуть в язык всякую хрень, которую можно запилить отдельно?

no-such-file ★★★★★
()

Для тех, кому это действительно необходимо, есть QtCore, который особенного оверхеда не несет, но при этом решает проблему.

Всем остальным это «нинужна»(с)(тм).

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Если серьезно - нафейхоа тянуть в язык всякую хрень, которую можно запилить отдельно?

Если можно запилить библиотекой - действительно не стоит, а если кодогенератором/препроцессором - в язык стоит добавить недостающие базовые возможности.

Begemoth ★★★★★
()
Ответ на: комментарий от trex6

QtCore, который особенного оверхеда не несет

equery size qtcore

* dev-qt/qtcore-4.8.4-r4 Total files : 1755 Total size : 27.91 MiB

действительно, не несёт.

anonymous
()
Ответ на: комментарий от anonymous

У абсолютного большинства он уже на диске есть, меньшенство скачает из репозитория. 27Мб в современном мире - совсем маленький размер и для сетей, и для хранилищ.

trex6 ★★★★★
()

реквестирую добавить в список просто возможность сделать так:

SomeClass *p = new SomeClass;
p++;
...
SomeClass *p = (SomeClass *)0x12345678;
и отсутствие уборщика мусора.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)

потому-что не нужно. Можешь сам поверх C++ запилить рефлексию, или использовать готовые наработки. В C++ вообще много чего нет (например ввода/вывода), и это - хорошо.

drBatty ★★
()
Ответ на: комментарий от Begemoth

а если кодогенератором/препроцессором - в язык стоит добавить недостающие базовые возможности.

Опять же, зачем тянуть какой-то кодогенератор в компилятор крестов? Средств кодогенерации и так хватает, а кому не хватает, тот может навелосипедить себе что-нибудь, да хоть на лиспе.

no-such-file ★★★★★
()

В следующем (вроде на 2014 предварительно назначили, но учитывая сколько заняло принятие с++11...) стандарте рефлексию (правда во время компиляции, а не рантайме) могут сделать.

DarkEld3r ★★★★★
()

1. В Qt почти никто не использует рантайм-метаинформацию в объёмах значительно отличающихся от того что можно родить при помощи dynamic_cast. Если вы используете рантайм-метаинформацию на всю катушку вы либо фрик, либо пытаетесь дёргать QObject'ы из языка отличного от C++, либо (что вероятнее) и то и другое сразу. «Успех» Qt обусловлен его простотой и переносимостью.

2. 2013 год. В C++ нет автоматического управления памятью. Память и ресурсы приходится выделять и высвобождать вручную…

3, 4… Приведите сами

А теперь ответ: это никому не нужно.

KblCb ★★★★★
()
Последнее исправление: KblCb (всего исправлений: 1)
Ответ на: комментарий от KblCb

либо фрик, либо пытаетесь дёргать QObject'ы из языка отличного от C++, либо (что вероятнее) и то и другое сразу

Из QML, например, тоже фрики дергают QObject'ы?

kamre ★★★
()
Ответ на: комментарий от no-such-file

Опять же, зачем тянуть какой-то кодогенератор в компилятор крестов?

Для той-же compile-time рефлексии тянуть дополнительный кодогенератор в компилятор не требуется, нужно только добавить в язык несколько метафункций для перечисления членов класса.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

тянуть дополнительный кодогенератор в компилятор

У вас в системе питона и перла нет? Никто, что-то не плачет, что приходится для программирования Eclipse тянуть или NetBeans какой, а тут прям тяжко как.

no-such-file ★★★★★
()
Ответ на: комментарий от Pavval

2013 год. В C++ нет автоматического управления памятью.

Почитай стандарт на тему сборки мусора.

Под автоматическим управлением памятью подразумевается нормальный сборщик мусора.

anonymous
()
Ответ на: комментарий от KblCb

Это дерганье C++ QObject'ов из QML полностью построено на коде, который генерирует MOC, а значит «вы используете рантайм-метаинформацию на всю катушку». Все, кто используют QML, «фрики»?

kamre ★★★
()
Ответ на: комментарий от Legioner

Ну сгенерируй код метода serialize в компайл-тайме. На D, например, я представляю, как это сделать. Как это сделать на С++?

Я делал это с помощью clang. Ничего сложного. На гитхабе код есть.

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от kamre

У меня было сказано, что те кто используют метаинформацию в Qt либо фрики, либо используют её для того чтобы дёргать QObjeсt'ы не из C++ (а например из QML). Читайте внимательно.

KblCb ★★★★★
()
Ответ на: комментарий от quiet_readonly

Вот я тоже думаю что для компиляторов в которых есть архитектура (шланг, например), реализация компайл-тайм рефлексии - не проблема.

nerdogeek
() автор топика
Ответ на: комментарий от trex6

а потом получается, что задачи, для которых 30 лет назад хватало 2MHz процессора и 1Mb памяти, сейчас требуют в 2000 раз больше ресурсов.

anonymous
()
Ответ на: комментарий от quiet_readonly

Ты издеваешься? В твоём примере obj это ссылка на значение, которую можно например вернуть из функции не думая о том как сделать так чтобы объект на которой она ссылается не был грохнут по выходу из контекста, а можно не возвращать и тогда таки объект будет собран мусорщиком. Если изрядно обмазаться умными указателями можно изобразить что-то похожее в плюсах и даже сделать лучше. Но только это не автоматическое управление ресурсами.

KblCb ★★★★★
()
Ответ на: комментарий от anonymous

Зато их решение, в отличии от былых времен, дело 3х секунд.

Мы ведь не гонимся за производительностью, мы гонимся за решением задач. Производительность - лишь искусственная величина, которая порой позволяет удобно оценить качество решения, но далеко не во всех случаях именно эта величина играем главную роль.

trex6 ★★★★★
()
Ответ на: комментарий от no-such-file

Никто, что-то не плачет, что приходится для программирования Eclipse тянуть или NetBeans какой, а тут прям тяжко как.

Ну так мы же обсуждаем полноценный язык, который и без IDE совершенен.

O02eg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.