Название: Массив темплейт классов Отправлено: Igors от Август 28, 2015, 12:09 Добрый день
Есть простой темплейт класс Код Прочитал из файла число таких, напр это 2. Из них первый напр MyClass<int>, второй MyClass<double>, для каждого тип в файле указан. Как мне представить считанные экземпляры в виде массива? Ну ясно все эл-ты массива должны иметь один тип, поэтому чем можно удобно его заменить? Спасибо Название: Re: Массив темплейт классов Отправлено: vbv от Август 28, 2015, 13:42 Абстрактным классом.
А темплейт унаследовать от этого абстрактного класса. Название: Re: Массив темплейт классов Отправлено: Igors от Август 28, 2015, 13:46 Абстрактным классом. Ну да, и массив не классов а указателей на абстрактный. Так я умею, но думал, может уже как-то по-новому можно (новый стандарт и все такое)А темплейт унаследовать от этого абстрактного класса. Название: Re: Массив темплейт классов Отправлено: m_ax от Август 28, 2015, 13:50 boost::any, variant?
Название: Re: Массив темплейт классов Отправлено: Igors от Август 29, 2015, 15:15 Чтобы не плодить темы - здесь же еще один простой (надеюсь) вопрос по template
Код Не смертельно, но хотелось бы избежать такого расписывания. У меня есть табличка/мапа "имя класса - ф-ция его создания" Цитировать { "Real", СreateСlassFloat } Вместо которой лучше было бы{ "Integer", СreateСlassInt } Цитировать { "Real", СreateСlass<float> } Как это оформить?{ "Integer", СreateСlass<int> } Спасибо Название: Re: Массив темплейт классов Отправлено: Old от Август 29, 2015, 16:02 Код
Название: Re: Массив темплейт классов Отправлено: m_ax от Август 29, 2015, 16:15 Код
Если я правильно понял, то он (igors) не может таким образом запихнуть в мап указатель на шаблон функции) В смысле, как я понял, есть такой мап: Код Вообщем, зная TC надо подождать) Может внезапно какие новые детали всплывут) Название: Re: Массив темплейт классов Отправлено: Old от Август 29, 2015, 16:20 А, ну тогда еще std::function в придачу. :)
Название: Re: Массив темплейт классов Отправлено: Igors от Август 30, 2015, 07:05 Если я правильно понял, то он (igors) не может таким образом запихнуть в мап указатель на шаблон функции) Ну так и есть - как я в мапе/табличке "идентифицирую" напр CreateFunc<float> ? В смысле, как я понял, есть такой мап: Код Вообщем, зная TC надо подождать) Может внезапно какие новые детали всплывут) Название: Re: Массив темплейт классов Отправлено: Old от Август 30, 2015, 07:08 Что значит как идентифицирую?
Вы по ключу получите функцию, которая при вызове создаст вам объект. Название: Re: Массив темплейт классов Отправлено: m_ax от Август 30, 2015, 12:51 Какое-то станное решение с мапом и указателями на эти функции.. Может я опять не всё понимаю, но не проще ли было бы тогда завести обычный список std::list<std::string> и + один указатель на функтор:
Код
И всё.. Я, правда, не знаю как это всё у вас используется и т.п. и т.д.. но.. Название: Re: Массив темплейт классов Отправлено: Igors от Август 30, 2015, 14:11 Используется очень просто. Вот мапа
Цитировать { "Real", СreateСlassFloat } Считали строку из файла, напр она "Real" - ну значит вызвали СreateСlassFloat и сохранили возвращенное значение. Неаккуратно что СreateСlassFloat, СreateСlassInt и др - вызовы отличающиеся лишь типом темплейта { "Integer", СreateСlassInt } Название: Re: Массив темплейт классов Отправлено: Old от Август 30, 2015, 15:06 Одним словом это называется фабрика.
Теперь сможете сделать аккуратней. Название: Re: Массив темплейт классов Отправлено: _Bers от Август 30, 2015, 15:09 Используется очень просто. Вот мапа Цитировать { "Real", СreateСlassFloat } Считали строку из файла, напр она "Real" - ну значит вызвали СreateСlassFloat и сохранили возвращенное значение. Неаккуратно что СreateСlassFloat, СreateСlassInt и др - вызовы отличающиеся лишь типом темплейта { "Integer", СreateСlassInt } нужно что-то типа такого? http://rextester.com/JFRPI86597 Код: //Title of this code Название: Re: Массив темплейт классов Отправлено: m_ax от Август 30, 2015, 15:19 Ну тогда так:
Код
Название: Re: Массив темплейт классов Отправлено: m_ax от Август 30, 2015, 16:38 Цитировать Ну тогда так: В принципе, это то же самое, что и _Bers предложил чуть выше) Название: Re: Массив темплейт классов Отправлено: Igors от Август 31, 2015, 09:31 А что это значит? (как это осмыслить). Указатель на тип + скобки, а где же имя ф-ции ??? Ага, это сынтаксыс std::functon (тип возврата и в скобках аргументы). Но каким волшебным образом она понимает template ??? Название: Re: Массив темплейт классов Отправлено: Old от Август 31, 2015, 10:02 Можно почитать про std::function самому, как уже предлагалось, или дождаться _Bers, чтобы он все подробно разжевал. :)
Название: Re: Массив темплейт классов Отправлено: Igors от Август 31, 2015, 12:06 А что это значит? (как это осмыслить). Указатель на тип + скобки, а где же имя ф-ции ??? Ага, это сынтаксыс std::functon (тип возврата и в скобках аргументы). Но каким волшебным образом она понимает template ??? Да, и std::function создает "за кадром" какие-то шаред (как у m_ax) или нет? Название: Re: Массив темплейт классов Отправлено: Igors от Август 31, 2015, 12:22 А вот еще с темплейтами. Иногда делают так
Код Ну и дальше юзают mData имея ввиду его реальную длину. Оно конечно со всех сторон плохо (липовый sizeof, new не работает и.т.д), но для тупых данных и при большом числе таких "эл-тов" память экономится хорошо - и это может окупить все минусы. Недавно думал задействовать такую городушку (правда потом отказался). Как же такой "эл-т" поместить в контейнер? Казалось бы все просто Код Но это ничего не дает т.к. num должен быть известен на момент компиляции. Конечно можно "на базе std::vector <char>" - но там совсем кисло :'( Какие еще есть ходики? Спасибо Название: Re: Массив темплейт классов Отправлено: m_ax от Август 31, 2015, 12:35 Цитировать Ага, это сынтаксыс std::functon (тип возврата и в скобках аргументы). Но каким волшебным образом она понимает template ??? Это, фактически, специализация шаблона:Код
Цитировать Да, и std::function создает "за кадром" какие-то шаред (как у m_ax) или нет? Нет, это просто функтор, который хранит указатель на функцию, или на член-функцию и вызывает её в operator(), от вида которого Вам так плохеет :)Название: Re: Массив темплейт классов Отправлено: _Bers от Август 31, 2015, 20:27 Можно почитать про std::function самому, как уже предлагалось, или дождаться _Bers, чтобы он все подробно разжевал. :) мне влом. оно это умеет, и достаточно. технические подробности - чрезвычайно (просты?) сложны для понимания. производители компиляторов (стандартной библиотеки) юзают расширения компиляторов. так что там под капотом "чистым с++" не пахнет. могу лишь сказать, что по перфомансу, std::function медленный по времени создания, но имеет порядка 10 микросекунд выигрыша за каждый аргумент при запуске. и этот отрыв мне средствами самого с++ (по честному) преодолеть не удалось. Название: Re: Массив темплейт классов Отправлено: m_ax от Сентябрь 01, 2015, 00:34 Цитировать могу лишь сказать, что по перфомансу, 10 микросекунд (10^-6)..? А какова была погрешность самих измерений?) std::function медленный по времени создания, но имеет порядка 10 микросекунд выигрыша за каждый аргумент при запуске. Название: Re: Массив темплейт классов Отправлено: Igors от Сентябрь 01, 2015, 10:21 технические подробности - чрезвычайно (просты?) сложны для понимания. Ну хорошо, кое-что надо "тупенько запомнить", все понимать - головы не хватит. А может ли такая ф-ция иметь др модель вызова (не cdecl)? производители компиляторов (стандартной библиотеки) юзают расширения компиляторов. так что там под капотом "чистым с++" не пахнет. Название: Re: Массив темплейт классов Отправлено: Old от Сентябрь 01, 2015, 10:26 А может ли такая ф-ция иметь др модель вызова (не cdecl)? Что вы имеете ввиду под другой моделью вызова?Название: Re: Массив темплейт классов Отправлено: Igors от Сентябрь 02, 2015, 07:26 Еще проблемка (уже не первый раз с ней сталкиваюсь). Ладно, объявил базовый класс
Код И унаследовался с темплейтом Код Теперь я могу иметь контейнер указателей на базовый класс. C реализацией методов Size и Apply проблем не возникает, но что делать с Get()? Он ведь не может быть виртуалом. А необходимость в нем (или даже в операторах []) возникает часто, напр Код Если бы аргументом был MyDerivedClass<T> - все хорошо, но где ж такой аргумент взять? Название: Re: Массив темплейт классов Отправлено: Tuxford от Сентябрь 02, 2015, 11:14 Так дело имеем с темплейтной функцией. Вот она не может быть виртуальной.
Но можно сделать класс темплейнтным. Тогда Get может быть виртуальной. Код
Код
Код
Такой вариант вполне будет. Название: Re: Массив темплейт классов Отправлено: Igors от Сентябрь 02, 2015, 11:33 Но можно сделать класс темплейнтным. Тогда Get может быть виртуальной. Тогда мне не раскрутиться с массивом. Напр сейчас Код При этом наследники MyBaseClass могут иметь разные типы. А так Код
Название: Re: Массив темплейт классов Отправлено: m_ax от Сентябрь 02, 2015, 11:35 Цитировать Еще проблемка (уже не первый раз с ней сталкиваюсь). Ладно, объявил базовый класс Не первый раз уже повторяю: boost::any, variant:Код
Цитировать Но можно сделать класс темплейнтным. Тогда Get может быть виртуальной. Так его (базовый класс) специально сделали не шаблонным) :)Название: Re: Массив темплейт классов Отправлено: Igors от Сентябрь 02, 2015, 14:54 Не первый раз уже повторяю: boost::any, variant: Хмм... заманчиво. Но все-таки сначала хочу убедиться что чисто средствами языка это слишком хлопотно. Подождем что скажет академик :) Название: Re: Массив темплейт классов Отправлено: m_ax от Сентябрь 02, 2015, 18:17 Цитировать Но все-таки сначала хочу убедиться что чисто средствами языка это слишком хлопотно. В смысле? А в boost'е какими средствами это реализовано?) Да и недавно товарищ navrovsky писал здесь свой any) |