Re: Как можно отказаться от шаблонов?
От: Alexander G Украина  
Дата: 19.09.17 15:34
Оценка: 5 (1) +2
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте,


SaZ>Есть несколько структур, которые наследуются от базовой и содержат одинаковые поля. И некоторый враппер, который позволяет брать из них данные в удобном виде.

SaZ>Хочется как-то отказаться от шаблонов, чтобы закоментированный код работал. Выносить общие переменные в базовую структуру нельзя.

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


struct MetaBase
{
    virtual ~MetaBase() {}
    virtual std::string name() const = 0;
 
    virtual const Base* operator->() const = 0;
};
 

 
// Геттеры
template< typename T >
struct Meta : MetaBase
{
    static_assert(std::is_base_of<Base, T>::value, "");
 
    public:
    explicit Meta( const T& data )
        : _data{ data }
    {}
 
    virtual std::string name() const override
    {
        return "Name is: " + _data.name;
    }
 
    virtual const T* operator->() const override
    {
        return &_data;
    }
 
private:
    const T& _data;
};
 

 
template< typename T >
std::unique_ptr<MetaBase> Wrap( const T& data )
{
    return std::make_unique<Meta<T>>( data );
}
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.