LINUX.ORG.RU

Прикрутить к классу чтение полей из конфиг-файла малой кровью

 


0

3

Сабж. Давно с этой проблемой не сталкивался (делал такие вещи через питон), но сейчас вылез проект где от питона придется отказываться. Че-то свелосипедил, но уже полезли ошибки - параметров много, чего то забыл указать и упс...

Собственно пожелания. У меня С++ класс

class Model{
...
    double a; // какой то параметр
    int b;    // и еще один параметр
...
};
изначально биндиться в питон через SWIG, в питоне пишется
...
model = Model()
model.a = 1.5 # какой то параметр
model.b = 2   #  и еще один параметр
...

Теперь я вынужден выкинуть питон, и мне бы хотелось иметь возможность тупо скопипастить в конфиг-файл соответствующую часть питоньего файла + модифицировать хидер минимальным образом. С-но вопрос в том как реализовать минимальную модификацию хидера, с чтением конфига в плюсах я как нить справлюсь;-)

В идеале хотелось бы писать в хидере

class Model{
...
    PAR(double, a, "какой то параметр");
    PAR(int, b, "и еще один параметр");
...
};
где PAR - некий хитрый макрос, регистрирующий поле класса в таблице для последующего чтения из конфига. Но видимо это невозможно?

Более затратной возможностью является вариант

class Model{
    template <typename ... Args > void regparams(const char* arglist, Args ... args); // регистрирует нужные поля класса
...
    double a; // какой то параметр
    int b;    // и еще один параметр
...
    Model(){ PARAMS(a, b, ...); }
};
где PARAMS - тоже макрос вида
PARAMS(ARGS...) regparams(#ARGS, ARGS);

Может кто еще какие варианты предложит? Повторяюсь, основное требование - минимальное дополнительное упоминание полей класса, их просто туева хуча.

★★★★★

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

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

Тут же речь о C++ всё-таки :-) На правах наркомании код тут. Накидал по-быстрому, можно упростить избавившись от указателя на поля класса (изначально статически список элементов хотел, но инициализатор не constexpr, может можно как-то иначе сделать при желании).

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)
Ответ на: комментарий от xaizek

Фигасе... O_O

Я то думал что я склонен к извращениям, но это... прикольно, спасибо!;-)

Буду вкуривать.

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

Всё больше понимаю, что не знаю С++.

Объясни, плз, а что вот это T C::* ptr; значит? Почему два typename?

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

что вот это T C::* ptr; значит?

Это объявление указателя на поле класса C типа T.

Почему два typename?

Там же два параметра, у каждого должен быть указан тип (typename/class это не тип, но можно же и bool/int).

xaizek ★★★★★
()

boost::program_options это умеет, примерно в таком виде там макросы и описывают параметры конфигов. но не сказать, что он слишком удобен. а вообще, сериализаторы ещё можно посмотреть бустовские. там можно сериализовать/десериализовать в текст, произвольно.

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

Не хочу буст тащить в проект... но в качестве примера надо таки глянуть, спасибо;-)

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