Salut,
je développe un framework C++ pour l’optimisation mathématique et je m’arrache un peu les cheveux pour trouver un design qui tient la route au niveau des matrices creuses.
En gros :
- j’ai deux types de représentations de matrices creuses : appelons les
A
etB
; - j’ai deux solveurs linéaires,
machin
ettruc
.machin
travaille exclusivement avec des matrices de typeA
ettruc
exclusivement avec des matrices de typeB
. - du coup, j’aimerais templater mon code pour que le choix d’un solveur
machin
outruc
(à l’exécution) fixe le type des toutes les matrices (A
ouB
) dans tout le reste du code.
J’ai essayé le code (simplifié) suivant :
template <class MatrixType>
class LinearSolver {
virtual void factorize(const MatrixType& matrix) = 0;
}
class LinearSolverMachin: public LinearSolver<MatrixTypeA> {
void factorize(const MatrixTypeA& matrix) override;
}
class LinearSolverTruc: public LinearSolver<MatrixTypeB> {
void factorize(const MatrixTypeB& matrix) override;
}
Le supertype commun à LinearSolverMachin
et LinearSolverTruc
étant le type template LinearSolver
, j’ai templaté la classe LinearSolverFactory
elle-même :
template<class MatrixType>
class LinearSolverFactory {
public:
std::unique_ptr<LinearSolver<MatrixType> > create(const std::string& solver_name) {
if (solver_name == "machin") {
return std::make_unique<LinearSolverMachin>();
}
else {
return std::make_unique<LinearSolverTruc>();
}
}
Puis à plus haut niveau, j’appelle LinearSolverFactory::create()
avec le bon nom de solveur et le bon paramètre de template.
Malheureusement le code ne compile pas (il me dit que le std::unique_ptr<LinearSolverMachin>
ne peut pas être converti en std::unique_ptr<LinearSolver<MatrixTypeA> >
). Je ne suis pas assez calé en templates pour voir si le problème peut être corrigé.
Merci d’avance pour votre aide
Charlie