Есть несколько структур, которые наследуются от базовой и содержат одинаковые поля. И некоторый враппер, который позволяет брать из них данные в удобном виде.
Хочется как-то отказаться от шаблонов, чтобы закоментированный код работал. Выносить общие переменные в базовую структуру нельзя.
В крайнем случае придётся делать промежуточную структуру и копировать все данные туда. Но очень не хочется. Как можно провернуть такой фокус?
Здравствуйте, SaZ, Вы писали:
SaZ>Здравствуйте,
SaZ>Есть несколько структур, которые наследуются от базовой и содержат одинаковые поля. И некоторый враппер, который позволяет брать из них данные в удобном виде. SaZ>Хочется как-то отказаться от шаблонов, чтобы закоментированный код работал. Выносить общие переменные в базовую структуру нельзя.
Чтобы код, аналогичный закомментриованному, работал, не нужно отказываться от шаблона, нужно просто скрестить статический и динамический полиморфизм во таким образом:
Здравствуйте, SaZ, Вы писали:
SaZ>Хочется как-то отказаться от шаблонов, чтобы закоментированный код работал. Выносить общие переменные в базовую структуру нельзя. SaZ> Как можно провернуть такой фокус?
Динамический полиморфизм и type erasue всегда спасёт. Сделай базовый класс для Meta с виртуальной функцией name() и определяй её в потомках как угодно. Тогда итерироваться в цикле можно уже по ссылкам на этот базовый класс, которые все одного типа.
Здравствуйте, Alexander G, Вы писали:
SaZ>>Есть несколько структур, которые наследуются от базовой и содержат одинаковые поля. И некоторый враппер, который позволяет брать из них данные в удобном виде. SaZ>>Хочется как-то отказаться от шаблонов, чтобы закоментированный код работал. Выносить общие переменные в базовую структуру нельзя.
AG>Чтобы код, аналогичный закомментриованному, работал, не нужно отказываться от шаблона, нужно просто скрестить статический и динамический полиморфизм во таким образом:
для данного примера можно без уника:
const MetaBase& wa = Wrap( a );
const MetaBase& wb = Wrap( b );
std::cout << wa.name() << "\n";
std::cout << wb.name() << "\n";
for ( const auto meta : { &wa, &wb } )
std::cout << meta->name() << "\n";
Здравствуйте, SaZ, Вы писали:
SaZ>Здравствуйте,
SaZ>Есть несколько структур, которые наследуются от базовой и содержат одинаковые поля. И некоторый враппер, который позволяет брать из них данные в удобном виде. SaZ>Хочется как-то отказаться от шаблонов, чтобы закоментированный код работал. Выносить общие переменные в базовую структуру нельзя.
SaZ>В крайнем случае придётся делать промежуточную структуру и копировать все данные туда. Но очень не хочется. Как можно провернуть такой фокус?
SaZ>Пример
Как вариант без копирования данных и без виртуальности... На ideone