LINUX.ORG.RU

C++11 templated for-cycle

 ,


0

4

Доброго времени суток!

В с++11 появилась возможность делать шаблоны с переменным числом аргументов. При этом есть мануалы, как пройтись по списку всех переменных, переданных в функцию, даже если они разного типа, как посчитать количество переданных в шаблон типов. Но как пройтись по списку типов, не создавая переменных соответствующего типа?

Такая задача встала из необходимости создать контейнер для экземпляров разных классов, количество этих классов заранее неизвестно. При этом каждый класс имеет свои параметры инициализации, которые считываются из файла конфига. Какие будут параметры инициализации - тоже заранее неизвестно. Получается так, что надо бы определить в этих классах функцию чтения части конфига, которую далее вызывать еще до момента создания этих классов. Ясно, что она будет статиком. Но как ее вызывать для набора таких классов - хз.

Кароч, нужен какой-то вот такой код (суть, я думаю, ясна, хоть он и, очевидно, не работающий):

#include <libconfig.h++>
void f1()
{
    Config cfg;
    cfg.readFile("ololo.cfg");
    const Setting& settings = cfg.getRoot();
    template<class ...T>for(auto t: ...T)
    {
        t::LoadConfig(settings);
    }
}

★★

Ответ на: комментарий от anonymous

А кортежи умеют вызывать статик-функции из еще несозданных экземпляров класса?

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

Я вот думаю, а не заводить ли просто отдельно два класса вместо одного? В одном создать загрузку параметров из конфига, а во второй передавать указатель на первый класс.

aido ★★
() автор топика

Либо boost::mpl, либо «рекурсивно»:

template <typename T>
void LoadConfig(const Setting& settings)
{
    T::LoadConfig(settings);
}

template <typename T, typename... Args>
void LoadConfig(const Setting& settings)
{
    T::LoadConfig(settings);
    LoadConfig<Args...>(settings);
}

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

Вообще это стандартный способ прохода по шаблону с переменным числом аргументов, разве что останов раскрутки часто делают функцией без аргументов, а не с одним (хотя тут зависит от задачи). Не понятно как ты смотрел все этим мануалы, ведь там все то же самое.

staseg ★★★★★
()

Топикстартер - сиплюсплюс-дурачок, пытающийся нечитаемой шаблонной магией решать то, что спокойно решается нормальными, например ООПными, шаблонами проектирования.

hlebushek ★★
()

я такое делаю с помощью вариаций на тему X-Macro

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