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

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

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

Сообщений: 11445


Просмотр профиля
« : Август 28, 2015, 12:09 »

Добрый день

Есть простой темплейт класс
Код
C++ (Qt)
template <class T>
struct MyClass {
...
std::vector<T> mData;
};
Прочитал из файла число таких, напр это 2. Из них первый напр MyClass<int>, второй MyClass<double>,  для каждого тип в файле указан. Как мне представить считанные экземпляры в виде массива? Ну ясно все эл-ты массива должны иметь один тип, поэтому чем можно удобно его заменить?

Спасибо
Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #1 : Август 28, 2015, 13:42 »

Абстрактным классом.
А темплейт унаследовать от этого абстрактного класса.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 28, 2015, 13:46 »

Абстрактным классом.
А темплейт унаследовать от этого абстрактного класса.
Ну да, и массив не классов а указателей на абстрактный. Так я умею, но думал, может уже как-то по-новому можно (новый стандарт и все такое)
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #3 : Август 28, 2015, 13:50 »

boost::any, variant?
Записан

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

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

Сообщений: 11445


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

Чтобы не плодить темы - здесь же еще один простой (надеюсь)  вопрос по template
Код
C++ (Qt)
typedef MyBaseClass * (*CreateFunc)( int param1... );
 
MyBaseClass * СreateСlassFloat( int param1... ) { return new MyDerivedClass<float>(param1...); }
MyBaseClass * СreateСlassInt( int param1... ) { return new MyDerivedClass<int>(param1...); }
... и.т.д
 
Не смертельно, но хотелось бы избежать такого расписывания. У меня есть табличка/мапа "имя класса - ф-ция его создания"
Цитировать
{ "Real", СreateСlassFloat }
{ "Integer", СreateСlassInt }
Вместо которой лучше было бы
Цитировать
{ "Real", СreateСlass<float> }
{ "Integer", СreateСlass<int> }
Как это оформить?

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

Сообщений: 4349



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

Код
C++ (Qt)
template<typename T>
MyBaseClass *createClass( int param1... )
{
   return new MyDerivdClass<T>( param1... );
}
 
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



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

Код
C++ (Qt)
template<typename T>
MyBaseClass *createClass( int param1... )
{
   return new MyDerivdClass<T>( param1... );
}
 

Если я правильно понял, то он (igors) не может таким образом запихнуть в мап указатель на шаблон функции)
В смысле, как я понял, есть такой мап:
Код
C++ (Qt)
std::map<std::string, CreateFunc>
 
Вообщем, зная TC надо подождать) Может внезапно какие новые детали всплывут)   
   
Записан

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

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

Сообщений: 4349



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

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

Сообщений: 11445


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

Если я правильно понял, то он (igors) не может таким образом запихнуть в мап указатель на шаблон функции)
В смысле, как я понял, есть такой мап:
Код
C++ (Qt)
std::map<std::string, CreateFunc>
 
Вообщем, зная TC надо подождать) Может внезапно какие новые детали всплывут)   
Ну так и есть - как я в мапе/табличке "идентифицирую" напр CreateFunc<float> ?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



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

Что значит как идентифицирую?
Вы по ключу получите функцию, которая при вызове создаст вам объект.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



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

Какое-то станное решение с мапом и указателями на эти функции.. Может я опять не всё понимаю, но не проще ли было бы тогда завести обычный список std::list<std::string> и + один указатель на функтор:

Код
C++ (Qt)
 
struct creator
{
   template<class T>
   MyBaseClass * operator()( int param1... ) const
   {
        return new MyDerivdClass<T>( param1... );
   }
};
 
std::list<std::string> type_list;
 
 

И всё..

Я, правда, не знаю как это всё у вас используется и т.п. и т.д.. но..
« Последнее редактирование: Август 30, 2015, 12:53 от m_ax » Записан

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

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

Сообщений: 11445


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

Используется очень просто. Вот мапа
Цитировать
{ "Real", СreateСlassFloat }
{ "Integer", СreateСlassInt }
Считали строку из файла, напр она "Real" - ну значит вызвали СreateСlassFloat и сохранили возвращенное значение. Неаккуратно что СreateСlassFloat, СreateСlassInt и др - вызовы отличающиеся лишь типом темплейта
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



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

Одним словом это называется фабрика.
Теперь сможете сделать аккуратней.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


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

Используется очень просто. Вот мапа
Цитировать
{ "Real", СreateСlassFloat }
{ "Integer", СreateСlassInt }
Считали строку из файла, напр она "Real" - ну значит вызвали СreateСlassFloat и сохранили возвращенное значение. Неаккуратно что СreateСlassFloat, СreateСlassInt и др - вызовы отличающиеся лишь типом темплейта

нужно что-то типа такого?

http://rextester.com/JFRPI86597

Код:
//Title of this code
//g++  4.9.2

#include <functional>
#include <iostream>
#include <string>
#include <map>

struct IObject
{
    virtual ~IObject(){}
   
    virtual void View()const = 0;
};

template<class T>
struct Object : IObject
{
    void View()const { std::cout<<typeid(*this).name()<<std::endl; }
};


template<class T>
IObject* CreateObject()
{
    return new Object<T>;
}


int main()
{
    std::cout << "Hello, world!\n";
   
    typedef std::function< IObject*() >
        CreateFunc;
   
    typedef std::map<std::string, CreateFunc>
        Bind;
   
    Bind factory;
   
    factory["real"]    = CreateObject<float>;
    factory["integer"] = CreateObject<int>;
   
    auto* obj = factory["integer"]();
    obj->View();
   
    factory["real"]()->View();
   
}
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



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

Ну тогда так:

Код
C++ (Qt)
class creator_base
{
public:
   virtual ~creator_base() {}
   virtual MyBaseClass * operator()( int param1... ) const = 0;
};
 
template <class T>
class creator : public creator_base
{
public:
   virtual MyBaseClass* operator()(int param1...) const { return new MyDerivdClass<T>( param1... ); }
};
 
template <class T>
std::shared_ptr<creator<T>> create_function()
{
   return std::make_shared<creator<T>>();
}
 
std::map<std::string, std::shared_ptr<creator_base>> map;
 
map["Real"] = create_function<float>();
map["Integer"] =create_function<int>();
 
 
« Последнее редактирование: Август 31, 2015, 15:48 от m_ax » Записан

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

Arch Linux Plasma 5
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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