class 的 C++ 工厂专门化了一个模板化的 superclass
C++ factory of a class that specializes a templated superclass
我正在开发一个用于数学优化的 C++ 框架,并且正在努力为我的稀疏矩阵表示找到一个好的设计。
基本上:
- 我有两个稀疏矩阵表示:类型 A 和 B;
- 我有(比方说)四个线性求解器,Alan、Alicia、Beth 和 Benjamin。 Alan 和 Alicia 专门使用 A 矩阵,Beth 和 Benjamin 使用 B 矩阵;
- 我想模板化我的代码,以便在运行时选择线性求解器来设置其余代码中所有矩阵的类型(类型 A 或 B)(这样线性系统的矩阵是直接以正确的格式生成)。
我尝试了以下(简化的)代码:
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> >
)。我的模板不够好,看问题能否解决。
感谢您的帮助:)
查理
LinearSolverAlan
和 LinearSolverBeth
不共享基数,因为 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.
继承
我正在开发一个用于数学优化的 C++ 框架,并且正在努力为我的稀疏矩阵表示找到一个好的设计。
基本上:
- 我有两个稀疏矩阵表示:类型 A 和 B;
- 我有(比方说)四个线性求解器,Alan、Alicia、Beth 和 Benjamin。 Alan 和 Alicia 专门使用 A 矩阵,Beth 和 Benjamin 使用 B 矩阵;
- 我想模板化我的代码,以便在运行时选择线性求解器来设置其余代码中所有矩阵的类型(类型 A 或 B)(这样线性系统的矩阵是直接以正确的格式生成)。
我尝试了以下(简化的)代码:
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> >
)。我的模板不够好,看问题能否解决。
感谢您的帮助:)
查理
LinearSolverAlan
和 LinearSolverBeth
不共享基数,因为 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.