Как можно отказаться от шаблонов?
От: SaZ  
Дата: 19.09.17 15:07
Оценка:
Здравствуйте,

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

В крайнем случае придётся делать промежуточную структуру и копировать все данные туда. Но очень не хочется. Как можно провернуть такой фокус?

Пример

#include <type_traits>
#include <string>
#include <iostream>
 
// Данные
struct Base
{};
 
struct A : Base
{
    std::string name = "A";
};
 
struct B : Base
{
    std::string name = "B";
};
 
// Геттеры
template< typename T >
struct Meta
{
    static_assert(std::is_base_of<Base, T>::value, "");
 
    public:
    explicit Meta( const T& data )
        : _data{ data }
    {}
 
    std::string name() const
    {
        return "Name is: " + _data.name;
    }
 
    const T* operator->() const
    {
        return &_data;
    }
 
private:
    const T& _data;
};
 
template< typename T >
Meta<T> Wrap( const T& data )
{
    return Meta<T>{ data };
}
 
 
int main()
{
    const A a;
    const B b;
    const auto wa = Wrap( a );
    const auto wb = Wrap( b );
 
    std::cout << wa.name() << "\n";
    std::cout << wb.name() << "\n";
 
    //for ( const auto& meta : { wa, wb } ) // Увы
    //    std::cout << meta.name() << "\n";
 
    return 0;
}
Отредактировано 19.09.2017 15:09 SaZ . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.