Здравствуйте,
Есть несколько структур, которые наследуются от базовой и содержат одинаковые поля. И некоторый враппер, который позволяет брать из них данные в удобном виде.
Хочется как-то отказаться от шаблонов, чтобы закоментированный код работал. Выносить общие переменные в базовую структуру нельзя.
В крайнем случае придётся делать промежуточную структуру и копировать все данные туда. Но очень не хочется. Как можно провернуть такой фокус?
Пример
#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;
}