#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;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CgovLyDQlNCw0L3QvdGL0LUKc3RydWN0IEJhc2UKe307CgpzdHJ1Y3QgQSA6IEJhc2UKewogICAgc3RkOjpzdHJpbmcgbmFtZSA9ICJBIjsKfTsKCnN0cnVjdCBCIDogQmFzZQp7CiAgICBzdGQ6OnN0cmluZyBuYW1lID0gIkIiOwp9OwoKLy8g0JPQtdGC0YLQtdGA0YsKdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgpzdHJ1Y3QgTWV0YQp7CiAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxCYXNlLCBUPjo6dmFsdWUsICIiKTsKCiAgICBwdWJsaWM6CiAgICBleHBsaWNpdCBNZXRhKCBjb25zdCBUJiBkYXRhICkKICAgICAgICA6IF9kYXRheyBkYXRhIH0KICAgIHt9CgogICAgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuICJOYW1lIGlzOiAiICsgX2RhdGEubmFtZTsKICAgIH0KCiAgICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gJl9kYXRhOwogICAgfQoKcHJpdmF0ZToKICAgIGNvbnN0IFQmIF9kYXRhOwp9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgpNZXRhPFQ+IFdyYXAoIGNvbnN0IFQmIGRhdGEgKQp7CiAgICByZXR1cm4gTWV0YTxUPnsgZGF0YSB9Owp9CgoKaW50IG1haW4oKQp7CiAgICBjb25zdCBBIGE7CiAgICBjb25zdCBCIGI7CiAgICBjb25zdCBhdXRvIHdhID0gV3JhcCggYSApOwogICAgY29uc3QgYXV0byB3YiA9IFdyYXAoIGIgKTsKCiAgICBzdGQ6OmNvdXQgPDwgd2EubmFtZSgpIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgd2IubmFtZSgpIDw8ICJcbiI7CgogICAgLy9mb3IgKCBjb25zdCBhdXRvJiBtZXRhIDogeyB3YSwgd2IgfSApCiAgICAvLyAgICBzdGQ6OmNvdXQgPDwgbWV0YS5uYW1lKCkgPDwgIlxuIjsKCiAgICByZXR1cm4gMDsKfQ==