Я нахожусь на ранней стадии проекта C ++ и хотел создать для него интерфейс Python. Библиотека C ++ использует шаблонные классы для достижения полиморфизма времени компиляции. Однако для его переноса на Python мне потребуется перечислить все возможные варианты шаблонов и в результате получится огромный двоичный файл.
Так что мне интересно, как лучше всего перейти от полиморфизма времени компиляции к времени выполнения. Базовая c структура библиотеки выглядит следующим образом.
Основные классы являются дочерними по отношению к классу шаблона под названием Algorithm, который имеет 3 аргумента шаблона
template <template <class> class A, class B, typename data_t>
Algorithm {
protected:
....
std::vector<A<B>> unique_values;
std::vector<data_t> data;
std::shared_ptr<B> params;
....
public:
update() {
for (auto& val: unique_values)
val.update(data);
if (condition)
unique_values.push_back(A(params));
for (int i=unique_values.size(); i > 0; i++)
if (condition)
unique_values.erase(unique_values.begin() + i);
params->update(unique_values);
}
разные классы для шаблона Класс A различается в основном тем, какую структуру данных они хранят и как они выполняют обновление. Вот пример
template<class UnivParams>
class AUniv {
protected:
double mu;
double sig; // (mu and sig are the 'state')
std::shared_ptr<UnivParams> params;
public:
void update(std::vector<double> data) {
mu = ...;
sig = ...;
}
std::tuple<double, double> get_state() {
return std::make_tuple(mu, sig)
}
}
template<class MultiParams>
class AUniv {
protected:
Eigen::VectorXd mu;
Eigen::MatrixXd sig; // (mu and sig are the 'state')
std::shared_ptr<MultiParams> params;
public:
void update(std::vector<Eigen::VectorXd> data) {
mu = ...;
sig = ...;
}
std::tuple<Eigen::VectorXd, Eigen::VectorXd> get_state() {
return std::make_tuple(mu, sig)
}
}
Цель состоит в том, чтобы достичь полного полиморфизма времени выполнения, чтобы создать интерфейс Python для этой библиотеки. Я совершенно не уверен, как действовать дальше, но предполагаю, что это довольно распространенная дилемма, и многие люди, возможно, уже сталкивались с ней. У меня вопрос в том, как провести рефакторинг моего кода (возможно, создать фабрики?), Чтобы метод update () класса Algorithm мог работать с широким спектром различных классов As и B.
Спасибо!