Страница 3 из 4
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 15:52
WinMain
В языках высокого уровня, таких как C# или Java типы данных могут использоваться как значения, но эти программы исполняются внешними интерпретаторами.
В нативных же модулях, как сказал Ромео, нет никаких типов, есть только цепочки процессорных команд и массивы бинарных данных.
Соответственно, вся метаинформация о типах объектов (если таковая потребуется), должна быть получена в процессе компиляции и встроена компоновщиком в программный модуль.
Именно так происходит при сборке модуля в конфигурации Debug. Но и размер такого модуля в разы больше, чем в релизе.
Можно конечно и в релизный модуль встроить информацию о типах с помощью специальных библиотек и опций компилятора.
Можно ещё в ресурсы модуля встраивать подобную информацию, как например TLB-файл для СОМ-объектов.
Возникает вопрос целесообразности. Библиотеки для поддержки динамической типизации в С++ конечно же существуют, но когда их лучше использовать?
Лично мне на ум приходит пока только два варианта: это межпрограммное взаимодействие в распределённых системах и при сериализации данных со сложной объектной моделью.
В остальных же случаях на С++ вполне можно обойтись статическими типами данных. Иначе просто овчинка выделки не стоит.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 16:24
Absurd
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>().
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 16:28
Absurd
В языках высокого уровня, таких как C# или Java
Кроме того, для С++ тоже есть виртуальная машина - llvm. И mark&sweep уборщик мусора - boehm. Разве что C# и Java изначально разрабатывались под виртуальную машину и уборщик муосора.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 19:32
Сионист
Absurd писал(а):Что ты вкладываешь в глагол "вызывается"? Если ты имеешь в виду вызов шаблонной функции, то после компиляции ее не существует, а есть N специализаций для всех типов, для которых она была инстанциирована.
Но вызывать то я буду специализации, а не текст шаблона. И параметр будут принимать специализации.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 19:36
Сионист
Romeo писал(а):Код: Выделить всё
template <typename T>
void ShowSize()
{
std::cout << sizeof(T) << std::endl;
}
...
ShowSize<int>();
ShowSize<double>();
class A {};
ShowSize<A>();
Спасибо за подсказку, это хорошая замена желаемому.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 19:38
Absurd
Но вызывать то я буду специализации, а не текст шаблона.
А что мешает получить внутри шаблона всю информацию о типе при помощи средств из заголовка <type_traits>?
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 19:51
Сионист
WinMain писал(а):В языках высокого уровня, таких как C#
Каким боком решётка то к высокому уровню?
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 20:59
Сионист
У Шилдта в теории и практике c++ template <class. Что лучше и почему? Может ли шаблонная функция вывести ещё и имя типа? Как?
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 21:16
Absurd
Сионист писал(а):У Шилдта в теории и практике c++ template <class. Что лучше и почему?
Если у гугла спросить "template typename or template class" то он даст релевантный ответ первой же ссылкой.
Re: Может ли параметром функции быть имя типа?
Добавлено: 26 ноя 2015, 06:42
Сионист
Эйси.
Absurd писал(а):А что мешает получить внутри шаблона всю информацию о типе при помощи средств из заголовка <type_traits>?
Как это поможет передать функции только информацию о типе? Вернёмся к имени типа. Может ли шаблонная функция вывести ещё и имя типа? Как? Может ли шаблонная функция определить, специализирована ли она для числового, или не числового типа? Как? Может ли шаблонная функция определить, специализирована ли она для целого типа, или для типа с плавающей запятой? Как?