Здравствуйте, 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 );
}