LINUX.ORG.RU

Обобщить набор переменных одного параметризованного класса

 


1

3

Здравствуй, лор. Вводная:

A<T1> a1 = {...};
A<T2> a2 = {...};
...
A<Tn> an = {...};

Необходимо сделать что-то вроде:

for (auto ai: {a1, a2...an}) {...}

Разумеется это не работает, т.к. в полученном initializer_list не указан параметр.

Для частного случая, когда есть некое подмножество Tk1...Tkm с прямым наследованием, можно сделать так:

initializer_list<Tk_parent> ak1n = {ak1, ... , akn};
for (auto ai: ak1n) {...}

Но наследование есть не у всех классов из T1...Tn. Вопрос: таки может быть можно что-нибудь сделать?

★★★★★

T<A1> никак не связано с T<A2>, это просто разные типы с точки зрения языка. И, так как типы разные, то цикл должен быть во время компиляции. Примерно так (со списком аргументов вместо списка инициализации).

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)

Сильно зависит от того, что вы хотите делать со своими ai.

Возможно, вместо for имеет смысл подумать об использовании функции с variadic templates:

void process_a(A<T1> & a) {...}
void process_a(A<T2> & a) {...}
...
void process_a(A<Tn> & a) {...}

template< typename H, typename... T >
void process( H && h, T &&... tail ) {
  process_a(h);
  process(std::forward<T>(tail)...);
}
...
process(a1, a2,..., aN);

eao197 ★★★★★
()

Эмм, а какой тип тогда должен быть у ai? Статическую типизацию пока никто не отменял.

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Можно какой-нибудь boost::variant или ftl::sum_type сюда приделать, тогда с типами не возникнет проблем.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)

К сожалению божественный код обвязки делает невозможным вышеописанные трюки, поэтому тема снимается. :(

ЗЫ таки boost::variant подошёл бы весьма недурно, из плюсов - не нужно везде вколачивать гвоздями визитор. Но буста в проекте нет, а прикручивать его для задуманной цели было бы стрельбой из пушки по воробьям.

jcd ★★★★★
() автор топика
Ответ на: комментарий от jcd

а прикручивать его для задуманной цели

Выдерни его из буста, в сем проблема то? Он же хедеронли. Ну и реализаций вариантов тьма.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.