Может ли параметром функции быть имя типа?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
В языках высокого уровня, таких как C# или Java типы данных могут использоваться как значения, но эти программы исполняются внешними интерпретаторами.
В нативных же модулях, как сказал Ромео, нет никаких типов, есть только цепочки процессорных команд и массивы бинарных данных.
Соответственно, вся метаинформация о типах объектов (если таковая потребуется), должна быть получена в процессе компиляции и встроена компоновщиком в программный модуль.
Именно так происходит при сборке модуля в конфигурации Debug. Но и размер такого модуля в разы больше, чем в релизе.
Можно конечно и в релизный модуль встроить информацию о типах с помощью специальных библиотек и опций компилятора.
Можно ещё в ресурсы модуля встраивать подобную информацию, как например TLB-файл для СОМ-объектов.
Возникает вопрос целесообразности. Библиотеки для поддержки динамической типизации в С++ конечно же существуют, но когда их лучше использовать?
Лично мне на ум приходит пока только два варианта: это межпрограммное взаимодействие в распределённых системах и при сериализации данных со сложной объектной моделью.
В остальных же случаях на С++ вполне можно обойтись статическими типами данных. Иначе просто овчинка выделки не стоит.
В нативных же модулях, как сказал Ромео, нет никаких типов, есть только цепочки процессорных команд и массивы бинарных данных.
Соответственно, вся метаинформация о типах объектов (если таковая потребуется), должна быть получена в процессе компиляции и встроена компоновщиком в программный модуль.
Именно так происходит при сборке модуля в конфигурации Debug. Но и размер такого модуля в разы больше, чем в релизе.
Можно конечно и в релизный модуль встроить информацию о типах с помощью специальных библиотек и опций компилятора.
Можно ещё в ресурсы модуля встраивать подобную информацию, как например TLB-файл для СОМ-объектов.
Возникает вопрос целесообразности. Библиотеки для поддержки динамической типизации в С++ конечно же существуют, но когда их лучше использовать?
Лично мне на ум приходит пока только два варианта: это межпрограммное взаимодействие в распределённых системах и при сериализации данных со сложной объектной моделью.
В остальных же случаях на С++ вполне можно обойтись статическими типами данных. Иначе просто овчинка выделки не стоит.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Любой тяжелый фреймворк для С++ содержит в себе возможности рефлексии в той или иной форме. Например, Qt или gtkmm. В COM был IDispatch. По моему в MFC тоже было что-то такое (DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC если я еще помню).WinMain писал(а):В языках высокого уровня, таких как C# или Java типы данных могут использоваться как значения, но эти программы исполняются внешними интерпретаторами.
Еще библиотеки рефлексии:
http://www.axelmenzel.de/projects/coding/rttr
https://bitbucket.org/occash/umof
https://github.com/rpavlik/luabind
Можно определить стандартный интерфейс и всюду его использовать, например. Через RTTI это вообще просто сделать, как-то наподобие dynamic_cast<IReflection>().WinMain писал(а): В нативных же модулях, как сказал Ромео, нет никаких типов, есть только цепочки процессорных команд и массивы бинарных данных.
2B OR NOT(2B) = FF
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Кроме того, для С++ тоже есть виртуальная машина - llvm. И mark&sweep уборщик мусора - boehm. Разве что C# и Java изначально разрабатывались под виртуальную машину и уборщик муосора.В языках высокого уровня, таких как C# или Java
2B OR NOT(2B) = FF
Но вызывать то я буду специализации, а не текст шаблона. И параметр будут принимать специализации.Absurd писал(а):Что ты вкладываешь в глагол "вызывается"? Если ты имеешь в виду вызов шаблонной функции, то после компиляции ее не существует, а есть N специализаций для всех типов, для которых она была инстанциирована.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Спасибо за подсказку, это хорошая замена желаемому.Romeo писал(а):Код: Выделить всё
template <typename T> void ShowSize() { std::cout << sizeof(T) << std::endl; } ... ShowSize<int>(); ShowSize<double>(); class A {}; ShowSize<A>();
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Каким боком решётка то к высокому уровню?WinMain писал(а):В языках высокого уровня, таких как C#
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
У Шилдта в теории и практике c++ template <class. Что лучше и почему? Может ли шаблонная функция вывести ещё и имя типа? Как?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Если у гугла спросить "template typename or template class" то он даст релевантный ответ первой же ссылкой.Сионист писал(а):У Шилдта в теории и практике c++ template <class. Что лучше и почему?
2B OR NOT(2B) = FF
Эйси.
Как это поможет передать функции только информацию о типе? Вернёмся к имени типа. Может ли шаблонная функция вывести ещё и имя типа? Как? Может ли шаблонная функция определить, специализирована ли она для числового, или не числового типа? Как? Может ли шаблонная функция определить, специализирована ли она для целого типа, или для типа с плавающей запятой? Как?Absurd писал(а):А что мешает получить внутри шаблона всю информацию о типе при помощи средств из заголовка <type_traits>?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.