gpt4 book ai didi

专门化模板化父类(super class)的类的 C++ 工厂

转载 作者:行者123 更新时间:2023-12-04 07:16:01 26 4
gpt4 key购买 nike

我正在开发一个用于数学优化的 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;
    }
    求解器的常见父类(super class)型是模板类型 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>从通用(非模板)基类继承。

    关于专门化模板化父类(super class)的类的 C++ 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68754099/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com