Переход от полиморфизма времени компиляции к среде выполнения - PullRequest
1 голос
/ 16 июня 2020

Я нахожусь на ранней стадии проекта 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.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...