Может ли параметром функции быть имя типа?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

В языках высокого уровня, таких как C# или Java типы данных могут использоваться как значения, но эти программы исполняются внешними интерпретаторами.
В нативных же модулях, как сказал Ромео, нет никаких типов, есть только цепочки процессорных команд и массивы бинарных данных.
Соответственно, вся метаинформация о типах объектов (если таковая потребуется), должна быть получена в процессе компиляции и встроена компоновщиком в программный модуль.
Именно так происходит при сборке модуля в конфигурации Debug. Но и размер такого модуля в разы больше, чем в релизе.
Можно конечно и в релизный модуль встроить информацию о типах с помощью специальных библиотек и опций компилятора.
Можно ещё в ресурсы модуля встраивать подобную информацию, как например TLB-файл для СОМ-объектов.
Возникает вопрос целесообразности. Библиотеки для поддержки динамической типизации в С++ конечно же существуют, но когда их лучше использовать?
Лично мне на ум приходит пока только два варианта: это межпрограммное взаимодействие в распределённых системах и при сериализации данных со сложной объектной моделью.
В остальных же случаях на С++ вполне можно обойтись статическими типами данных. Иначе просто овчинка выделки не стоит.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

WinMain писал(а):В языках высокого уровня, таких как C# или Java типы данных могут использоваться как значения, но эти программы исполняются внешними интерпретаторами.
Любой тяжелый фреймворк для С++ содержит в себе возможности рефлексии в той или иной форме. Например, Qt или gtkmm. В COM был IDispatch. По моему в MFC тоже было что-то такое (DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC если я еще помню).

Еще библиотеки рефлексии:

http://www.axelmenzel.de/projects/coding/rttr
https://bitbucket.org/occash/umof
https://github.com/rpavlik/luabind
WinMain писал(а): В нативных же модулях, как сказал Ромео, нет никаких типов, есть только цепочки процессорных команд и массивы бинарных данных.
Можно определить стандартный интерфейс и всюду его использовать, например. Через RTTI это вообще просто сделать, как-то наподобие dynamic_cast<IReflection>().
2B OR NOT(2B) = FF
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

В языках высокого уровня, таких как C# или Java
Кроме того, для С++ тоже есть виртуальная машина - llvm. И mark&sweep уборщик мусора - boehm. Разве что C# и Java изначально разрабатывались под виртуальную машину и уборщик муосора.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Absurd писал(а):Что ты вкладываешь в глагол "вызывается"? Если ты имеешь в виду вызов шаблонной функции, то после компиляции ее не существует, а есть N специализаций для всех типов, для которых она была инстанциирована.
Но вызывать то я буду специализации, а не текст шаблона. И параметр будут принимать специализации.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):

Код: Выделить всё

template <typename T>
void ShowSize()
{
   std::cout << sizeof(T) << std::endl;
}

...

ShowSize<int>();
ShowSize<double>();

class A {};
ShowSize<A>();
Спасибо за подсказку, это хорошая замена желаемому.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Но вызывать то я буду специализации, а не текст шаблона.
А что мешает получить внутри шаблона всю информацию о типе при помощи средств из заголовка <type_traits>?
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

WinMain писал(а):В языках высокого уровня, таких как C#
Каким боком решётка то к высокому уровню?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

У Шилдта в теории и практике c++ template <class. Что лучше и почему? Может ли шаблонная функция вывести ещё и имя типа? Как?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Сионист писал(а):У Шилдта в теории и практике c++ template <class. Что лучше и почему?
Если у гугла спросить "template typename or template class" то он даст релевантный ответ первой же ссылкой.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Эйси.
Absurd писал(а):А что мешает получить внутри шаблона всю информацию о типе при помощи средств из заголовка <type_traits>?
Как это поможет передать функции только информацию о типе? Вернёмся к имени типа. Может ли шаблонная функция вывести ещё и имя типа? Как? Может ли шаблонная функция определить, специализирована ли она для числового, или не числового типа? Как? Может ли шаблонная функция определить, специализирована ли она для целого типа, или для типа с плавающей запятой? Как?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить