class 的 C++ 工厂专门化了一个模板化的 superclass

C++ factory of a class that specializes a templated superclass

我正在开发一个用于数学优化的 C++ 框架,并且正在努力为我的稀疏矩阵表示找到一个好的设计。
基本上:

我尝试了以下(简化的)代码:

template <class MatrixType>
class LinearSolver {
   virtual void factorize(const MatrixType& matrix) = 0;
}

class LinearSolverAlan: public LinearSolver<MatrixTypeA> {
   void factorize(const MatrixTypeA& matrix) override;
}

class LinearSolverAlicia: public LinearSolver<MatrixTypeA> {
   void factorize(const MatrixTypeA& matrix) override;
}

class LinearSolverBeth: public LinearSolver<MatrixTypeB> {
   void factorize(const MatrixTypeB& matrix) override;
}

class LinearSolverBenjamin: public LinearSolver<MatrixTypeB> {
   void factorize(const MatrixTypeB& matrix) override;
}

求解器的通用超类型是模板类型LinearSolver,所以我也对工厂进行了模板化:

template<class MatrixType>
class LinearSolverFactory {
public:
   std::unique_ptr<LinearSolver<MatrixType> > create(const std::string& solver_name) {
     if (solver_name == "alan") {
        return std::make_unique<LinearSolverAlan>();
     }
     else if (...) {
        ...
     }
   }
};

然后在更高层次上,我使用正确的求解器名称和模板参数调用 LinearSolverFactory::create()

但是它不会编译(std::unique_ptr<LinearSolverAlan> 不能转换为 std::unique_ptr<LinearSolver<MatrixTypeA> >)。我的模板不够好,看问题能否解决。

感谢您的帮助:)

查理

LinearSolverAlanLinearSolverBeth 不共享基数,因为 LinearSolver<MatrixTypeA>LinearSolver<MatrixTypeB> 是两个不相关的类型。

您可以使用 if constexpr 丢弃未在工厂的特定实例化中使用的分支或专门化整个工厂:

template <typename MatrixType>
struct Factory;

template <> 
struct Factory<MatrixTypeA> {
   std::unique_ptr<LinearSolver<MatrixTypeA> > create(const std::string& name) {
         // select a LinearSolve<MatrixTypeA> and return it
   }
};

template <> 
struct Factory<MatrixTypeB> {
   std::unique_ptr<LinearSolver<MatrixTypeB> > create(const std::string& name) {
         // select a LinearSolver<MatrixTypeB> and return it
   }
};

另一种选择是使 LinearSolver<MatrixTypeB>LinearSovler<MatrixTypeB> 从公共(非模板)基础 class.

继承