Re: Вывод типа шаблона
От: andyp  
Дата: 26.01.14 18:09
Оценка: -1
Здравствуйте, lexer_lx, Вы писали:

_>

_>class Base
_>{
_>public:
_>    virtual char* data() = 0;
_>};

_>template<typename T>
_>class Derived : public Base
_>{
_>public:
_>    virtual char* data() { return reinterpret_cast<char*> m_data; }
_>private:
_>    T* m_data;
_>};

_>template<typename T>
_>class Service
_>{ ... };

_>Base* obj = new Derived<int>();

_>Service srv<???>();

_>


_>Можно ли, имея Base*, каким-то образом инстанцировать экземпляр Service его типом?


Сохранить const std::type_info & в Base при создании Derived ???
Вывод типа шаблона
От: lexer_lx Украина  
Дата: 26.01.14 10:28
Оценка:

class Base
{
public:
    virtual char* data() = 0;
};

template<typename T>
class Derived : public Base
{
public:
    virtual char* data() { return reinterpret_cast<char*> m_data; }
private:
    T* m_data;
};

template<typename T>
class Service
{ ... };

Base* obj = new Derived<int>();

Service srv<???>();


Можно ли, имея Base*, каким-то образом инстанцировать экземпляр Service его типом?
Re: Вывод типа шаблона
От: Abyx Россия  
Дата: 26.01.14 10:38
Оценка:
Здравствуйте, lexer_lx, Вы писали:

_>

_>Base* obj = new Derived<int>();

_>Service srv<???>();

_>


_>Можно ли, имея Base*, каким-то образом инстанцировать экземпляр Service его типом?


нет.

олсо это

Service<???> srv{};
In Zen We Trust
Re: Вывод типа шаблона
От: TarasB  
Дата: 26.01.14 15:56
Оценка:
Не очень понял, может Service<Base*> srv?
Re: фабрика классов + typeid ?(-)
От: The Passenger СССР  
Дата: 26.01.14 17:04
Оценка:
Re[2]: Вывод типа шаблона
От: andyp  
Дата: 26.01.14 18:25
Оценка:
правда, так информацию о типе, с которым инстантиировался Derived можно только сохранить. Использовать ее для инстанциирования Service не получится (нужно, чтобы инфа о типе была доступна при компиляции, а ее компилятор-то и не знает)
Re[3]: Вывод типа шаблона
От: lexer_lx Украина  
Дата: 26.01.14 19:16
Оценка:
Здравствуйте, andyp, Вы писали:

A>правда, так информацию о типе, с которым инстантиировался Derived можно только сохранить. Использовать ее для инстанциирования Service не получится (нужно, чтобы инфа о типе была доступна при компиляции, а ее компилятор-то и не знает)


Я в итоге сделал иначе, без таких извращений.
Просто интересно, можно ли с помощью "шаблонной магии" вытащить из Base тип и инстанцировать им другой шаблон?
Re[4]: Вывод типа шаблона
От: andyp  
Дата: 26.01.14 19:47
Оценка:
Здравствуйте, lexer_lx, Вы писали:

_>Здравствуйте, andyp, Вы писали:


A>>правда, так информацию о типе, с которым инстантиировался Derived можно только сохранить. Использовать ее для инстанциирования Service не получится (нужно, чтобы инфа о типе была доступна при компиляции, а ее компилятор-то и не знает)


_>Я в итоге сделал иначе, без таких извращений.

_>Просто интересно, можно ли с помощью "шаблонной магии" вытащить из Base тип и инстанцировать им другой шаблон?

Кроме того, что писал, посоветовать ничего не могу. Все вместе с фабрикой, которую советовали, выглядит как-то так:


#include <typeinfo>

class Base{
    const std::type_info& _ti;
public:
    Base(const std::type_info& ti):_ti(ti){}
    const std::type_info& get_ti() const {return _ti;}
    //остальной интерфейс
};


template<typename T>
class Derived : public Base
{
public:    
    Derived():Base(typeid(T)){}
};

class BaseService
{
public:
//интерфейс Service
};


template<typename T>
class Service: public BaseService
{
....
};

BaseService* service_factory(const Base* base_p)
{
        if(typeid(int) == base_p->get_ti())
            return new Service<int>();
        else
            return nullptr;
}
Re[4]: Вывод типа шаблона
От: night beast СССР  
Дата: 27.01.14 05:47
Оценка:
Здравствуйте, lexer_lx, Вы писали:

A>>правда, так информацию о типе, с которым инстантиировался Derived можно только сохранить. Использовать ее для инстанциирования Service не получится (нужно, чтобы инфа о типе была доступна при компиляции, а ее компилятор-то и не знает)


_>Я в итоге сделал иначе, без таких извращений.

_>Просто интересно, можно ли с помощью "шаблонной магии" вытащить из Base тип и инстанцировать им другой шаблон?

нет, вытащить в компилтайме тип, который будет известен в рантайме нельзя.
Re[5]: Вывод типа шаблона
От: Ops Россия  
Дата: 27.01.14 10:30
Оценка:
Здравствуйте, night beast, Вы писали:

NB>нет, вытащить в компилтайме тип, который будет известен в рантайме нельзя.


Но можно хранить не указатель на базу, а некую обертку, в которой будет какая-то информация о типе, примерно как в умных указателях с делетером сделано.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[6]: Вывод типа шаблона
От: night beast СССР  
Дата: 27.01.14 10:48
Оценка:
Здравствуйте, Ops, Вы писали:

NB>>нет, вытащить в компилтайме тип, который будет известен в рантайме нельзя.


Ops>Но можно хранить не указатель на базу, а некую обертку, в которой будет какая-то информация о типе, примерно как в умных указателях с делетером сделано.


можно, но ТС хотел получить эту информацию в компилтайме.
наиболее близкий аналог, это boost::variant, но не зная исходную задачу советовать что-либо бесполезно.
Re: Вывод типа шаблона
От: B0FEE664  
Дата: 27.01.14 10:57
Оценка:
Здравствуйте, lexer_lx, Вы писали:
  Скрытый текст
_>

_>class Base
_>{
_>public:
_>    virtual char* data() = 0;
_>};

_>template<typename T>
_>class Derived : public Base
_>{
_>public:
_>    virtual char* data() { return reinterpret_cast<char*> m_data; }
_>private:
_>    T* m_data;
_>};

_>template<typename T>
_>class Service
_>{ ... };

_>Base* obj = new Derived<int>();

_>Service srv<???>();

_>

_>Можно ли, имея Base*, каким-то образом инстанцировать экземпляр Service его типом?

Можно так:
class ServiceBase
{ ... };

template<typename T>
class Service : public ServiceBase
{ ... };


class Base
{
public:
    virtual char* data() = 0;
    virtual ServiceBase* GiveMeService() = 0;
};

template<typename T>
class Derived : public Base
{
public:
    virtual char* data() { return reinterpret_cast<char*> m_data; }
    virtual ServiceBase* GiveMeService() { return &m_oService; }
private:
    T* m_data;
    Service< Derived<T> > m_oService;
};

Base* obj = new Derived<int>();

ServiceBase* srv = obj->GiveMeService();

но вряд ли нужно.
И каждый день — без права на ошибку...
Re: Вывод типа шаблона
От: Кодт Россия  
Дата: 28.01.14 08:24
Оценка:
Здравствуйте, lexer_lx, Вы писали:

_>Можно ли, имея Base*, каким-то образом инстанцировать экземпляр Service его типом?


Можно ли выполнить работу времени компиляции в рантайме?
Не в С++.

Можно ли спроектировать Base и Service так, чтобы Service параметризовалось классом Derived в рантайме?
Конечно, да.
Начиная от Паттернов Проектирования ООП, и кончая эмуляцией дженериков. Но это нужно смотреть на содержимое Service, чтобы предметно говорить.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.