Изменить работу с шаблоном C ++ - PullRequest
0 голосов
/ 09 октября 2018

Вероятно, это повторяющийся вопрос, однако я не уверен, как его искать, и я пока не смог ничего найти.Предположим, что у меня есть два класса, которые выглядят так:

class MyMatrix : public MyAbstract {
  using MatrixType = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>;
  MatrixType A, B;
 public:
  ...
  MatrixType product() { return A * B; }
  ...
}

и

class MyDiagonal : public MyAbstract {
  using VectorType = Eigen::Matrix<double, Eigen::Dynamic, 1>;
  VectorType A, B;
 public:
  ...
  VectorType product() { return A.cwiseProduct(B); }
  ...
}

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

1 Ответ

0 голосов
/ 09 октября 2018

Используйте шаблон любопытного повторения шаблона (CRTP):

template <typename Derived>
class MyMatrixLikeThing : public MyAbstract {
public:
    void do_something() const {
        // How to access members of Derived:
        static_cast<Derived const&>(*this).A;
        static_cast<Derived const&>(*this).B;
        static_cast<Derived const&>(*this).product();
    }

    // Other functions
};

class MyMatrix : public MyMatrixLikeThing<MyMatrix> {
    friend MyMatrixLikeThing<MyMatrix>; // so that it can access private members

    using MatrixType = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>;
    MatrixType A, B;

public:
    MatrixType product() const { return A * B; }
};

class MyDiagonal : public MyMatrixLikeThing<MyDiagonal> {
    friend MyMatrixLikeThing<MyDiagonal>; // so that it can access private members

    using VectorType = Eigen::Matrix<double, Eigen::Dynamic, 1>;
    VectorType A, B;

public:
    VectorType product() const { return A.cwiseProduct(B); }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...