Russian Qt Forum
Апрель 25, 2024, 12:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Массив темплейт классов  (Прочитано 14828 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #15 : Август 30, 2015, 16:38 »

Цитировать
Ну тогда так:

В принципе, это то же самое, что и _Bers предложил чуть выше)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Август 31, 2015, 09:31 »

А что это значит? (как это осмыслить). Указатель на тип + скобки, а где же имя ф-ции Непонимающий
Ага, это сынтаксыс std::functon (тип возврата и в скобках аргументы). Но каким волшебным образом она понимает template Непонимающий
« Последнее редактирование: Август 31, 2015, 12:05 от Igors » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #17 : Август 31, 2015, 10:02 »

Можно почитать про std::function самому, как уже предлагалось, или дождаться _Bers,  чтобы он все подробно разжевал. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Август 31, 2015, 12:06 »

А что это значит? (как это осмыслить). Указатель на тип + скобки, а где же имя ф-ции Непонимающий
Ага, это сынтаксыс std::functon (тип возврата и в скобках аргументы). Но каким волшебным образом она понимает template Непонимающий

Да, и std::function создает "за кадром" какие-то шаред (как у m_ax) или нет?
« Последнее редактирование: Август 31, 2015, 12:24 от Igors » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Август 31, 2015, 12:22 »

А вот еще с темплейтами. Иногда делают так
Код
C++ (Qt)
struct CVarStruct {
int mID;   // "нормальный" член, он всегда есть
//.. еще какие-то нормальные
сhar mData[1];   // массив переменной длины
};
Ну и дальше юзают mData имея ввиду его реальную длину. Оно конечно со всех сторон плохо (липовый sizeof, new не работает и.т.д), но для тупых данных и при большом числе таких "эл-тов" память экономится хорошо - и это может окупить все минусы. Недавно думал задействовать такую городушку (правда потом отказался). Как же такой "эл-т" поместить в контейнер? Казалось бы все просто
Код
C++ (Qt)
template <size_t num>
struct Civilized {
int mID;  
сhar mData[num];  
};
Но это ничего не дает т.к. num должен быть известен на момент компиляции. Конечно можно "на базе std::vector <char>" - но там совсем кисло  Плачущий  Какие еще есть ходики?

Спасибо
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #20 : Август 31, 2015, 12:35 »

Цитировать
Ага, это сынтаксыс std::functon (тип возврата и в скобках аргументы). Но каким волшебным образом она понимает template  Непонимающий
Это, фактически, специализация шаблона:
Код
C++ (Qt)
template <class>
struct object;
 
template <class T, class U>
struct object<T (U)> {};
 

Цитировать
Да, и std::function создает "за кадром" какие-то шаред (как у m_ax) или нет?
Нет, это просто функтор, который хранит указатель на функцию, или на член-функцию и вызывает её в operator(), от вида которого Вам так плохеет  Улыбающийся
 
« Последнее редактирование: Август 31, 2015, 12:37 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #21 : Август 31, 2015, 20:27 »

Можно почитать про std::function самому, как уже предлагалось, или дождаться _Bers,  чтобы он все подробно разжевал. Улыбающийся

мне влом.

оно это умеет, и достаточно.

технические подробности - чрезвычайно (просты?) сложны для понимания.
производители компиляторов (стандартной библиотеки) юзают расширения компиляторов.
так что там под капотом "чистым с++" не пахнет.


могу лишь сказать, что по перфомансу,
std::function медленный по времени создания,
но имеет порядка 10 микросекунд выигрыша за каждый аргумент при запуске.

и этот отрыв мне средствами самого с++ (по честному) преодолеть не удалось.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #22 : Сентябрь 01, 2015, 00:34 »

Цитировать
могу лишь сказать, что по перфомансу,
std::function медленный по времени создания,
но имеет порядка 10 микросекунд выигрыша за каждый аргумент при запуске.
10 микросекунд (10^-6)..? А какова была погрешность самих измерений?)   
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Сентябрь 01, 2015, 10:21 »

технические подробности - чрезвычайно (просты?) сложны для понимания.
производители компиляторов (стандартной библиотеки) юзают расширения компиляторов.
так что там под капотом "чистым с++" не пахнет.
Ну хорошо, кое-что надо "тупенько запомнить", все понимать - головы не хватит. А может ли такая ф-ция иметь др модель вызова (не cdecl)?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #24 : Сентябрь 01, 2015, 10:26 »

А может ли такая ф-ция иметь др модель вызова (не cdecl)?
Что вы имеете ввиду под другой моделью вызова?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Сентябрь 02, 2015, 07:26 »

Еще проблемка (уже не первый раз с ней сталкиваюсь). Ладно, объявил базовый класс
Код
C++ (Qt)
struct MyBaseClass {
virtual void Apply( size_t index ) = 0;
virtual size_t Size( void  ) const = 0;
 
template <class T>
T Get( size_t index );  // ???
};
И унаследовался с темплейтом
Код
C++ (Qt)
template <class T>
struct MyDerivedClass : public MyBaseClass {
void Apply( size_t index );
size_t Size( void  ) const { return mData.size(); }
 
// data
std::vector <T> mData;
};
Теперь я могу иметь контейнер указателей на базовый класс. C реализацией методов Size и Apply проблем не возникает, но что делать с Get()? Он ведь не может быть виртуалом. А необходимость в нем (или даже в операторах []) возникает часто, напр
Код
C++ (Qt)
template <class T>
T CalcAverage( const MyBaseClass & src )
{
T sum = 0;
for (size_t i = 0; i < src.Size(); ++i)
 sum += src.Get<T>(i);
...
}
Если бы аргументом был MyDerivedClass<T> - все хорошо, но где ж такой аргумент взять?
Записан
Tuxford
Гость
« Ответ #26 : Сентябрь 02, 2015, 11:14 »

Так дело имеем с темплейтной функцией. Вот она не может быть виртуальной.
Но можно сделать класс темплейнтным. Тогда Get может быть виртуальной.

Код
C++ (Qt)
template <class T>
struct MyBaseClass {
virtual void Apply( size_t index ) = 0;
virtual size_t Size( void  ) const = 0;
virtual T Get( size_t index ) = 0;  
};

Код
C++ (Qt)
template <class T>
struct MyDerivedClass : public MyBaseClass {
void Apply( size_t index );
size_t Size( void  ) const { return mData.size(); }
T Get(size_t index) { return mData[index]; }
// data
std::vector <T> mData;
};
 

Код
C++ (Qt)
template <class T>
T CalcAverage( const MyBaseClass<T> & src )
{
T sum = 0;
for (size_t i = 0; i < src.Size(); ++i)
 sum += src.Get(i);
...
}
 

Такой вариант вполне будет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Сентябрь 02, 2015, 11:33 »

Но можно сделать класс темплейнтным. Тогда Get может быть виртуальной.
Тогда мне не раскрутиться с массивом. Напр сейчас
Код
C++ (Qt)
std::vector <MyBaseClass *> channels;
...
for (size_t i = 0; i < channels.size(); ++i)
 channels[i]->Apply(...);
 
При этом наследники MyBaseClass могут иметь разные типы. А так
Код
C++ (Qt)
std::vector <MyBaseClass <А здесь что??>*> channels;
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #28 : Сентябрь 02, 2015, 11:35 »

Цитировать
Еще проблемка (уже не первый раз с ней сталкиваюсь). Ладно, объявил базовый класс
Не первый раз уже повторяю: boost::any, variant:
Код
C++ (Qt)
struct MyBaseClass {
virtual void Apply( size_t index ) = 0;
virtual size_t Size( void  ) const = 0;
 
virtual boost::any Get( size_t index ) const  = 0;
};
 


Цитировать
Но можно сделать класс темплейнтным. Тогда Get может быть виртуальной.
Так его (базовый класс) специально сделали не шаблонным)  Улыбающийся


Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Сентябрь 02, 2015, 14:54 »

Не первый раз уже повторяю: boost::any, variant:
Хмм... заманчиво. Но все-таки сначала хочу убедиться что чисто средствами языка это слишком хлопотно. Подождем что скажет академик  Улыбающийся
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.278 секунд. Запросов: 23.