Например, есть базовый шаблонный класс в котором содеражатся настройки:
template<int nd>
struct config_t<nd> {};
config_t
:
template<typename tp>
struct data_t {};
typedef std::variant<config_t<1>, config_t<2>, ...> сonfig_var;
typedef std::variant<data_t<float>, data_t<double>, ...> data_var;
struct config_holder : config_var {
struct {
// stuff
} control;
config_holder (int nd, ...); // nd -> config_t<nd>
};
struct data_holder : data_var {
struct {
// memory management & stuff
} control;
data_holder (std::string &&type, const config_var &cfg, ...) { // data_holder -> data_t<type>
// What to do in the Kathmandu?..
}
};
Смысл конструкции в том, что config_holder
кодирует некоторые операции, а data_holder
хранит данные (над которыми проводятся эти операции) и иницируется строкой задающей тип и конфигом. Базовые шаблонные типы (которые с *_t
) потом передаются в числодробильный бэкэнд. А *_holder
это интерфейсы, с которыми взаимодействует пользователь.
И вот тут я застрял. Следуя совету intelfx, у меня получилось написать конструктор для config_holder
, но с data_holder
не понимаю как подступиться...
Следуя той же идеологии, я могу иницировать data_holder
для каждого допустимого типа, переданного строкой, но не понимаю, как дальше сконфигурировать его c помощью config_holder
...
Пробовал делать хелпер, который для каждого заданного строкой типа вызывет свой визитор и из него возвращать значения, но не срабатывает. Как такое всё таки реализовать, или как переписать что бы работало?