在运行时选择类成员的类型

sp1ke

我正在尝试构建一个包含其他类作为成员的模块化类,用户可以在运行时指定这些类的类型。我试图用模板来实现这一点,但意识到这可能不是正确的方法。这是一个最小的工作示例:

#include <iostream>

// One of the modules. Code will consist of multiple of these modules.
template <class T, class U>
class Module1 {
public:
    T subModule1;
    U subModule2;
};

class Add {
public:
    double Apply(double a) {
        return a + x;
    }

private:
    double x = 2.5;
};

class Multiply {
public:
    double Apply(double a) {
        return a * pi;
    }

private:
    double pi = 3.14;
};

class Divide {
public:
    double Apply(double a) {
        return a / pi;
    }

private:
    double pi = 3.14;
};

int main(int argc, char* argv[])
{
    // User input to determine the used submodules
    // Here the user decides to use the Add and Multiply submodules.
    Module1<Add, Multiply> module1;

    std::cout << module1.subModule1.Apply(3) + module1.subModule2.Apply(2) << std::endl;
}

但是我怎么能决定应该使用哪个子模块呢?例如,如果用户想要使用 Divide and Add 我必须创建 Module1 作为

Module1<Divide, Add> module1;

将有许多不同的子模块,因此使用 if 分支代码也是不可能的。我开始怀疑模板是否可行。您知道实现此目的的更好方法吗?请注意,实现也应该非常高效。

使用简单的多态性。

class Base { 
public:
    virtual ~Base() = default;
    virtual double Apply(double a) = 0;
};

class Add : public Base { 
public:
    double Apply(double a) override {}
};

class Multiply : public Base { 
public:
    double Apply(double a) override {}
};

class Module
{
public:
    void addModule(std::unique_ptr<Base> module) { 
        modules.push_back(std::move(module)); 
    }

    void Apply(double a) {
        for (const auto& module : modules)
            module->Apply(a);
    }

    std::vector<std::unique_ptr<Base>> modules;
}

Module m;
m.addModule(std::make_unique<Add>());
m.addModule(std::make_unique<Divide>());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用TypeBuilder获取在运行时创建的类的类型

来自分类Dev

选择在运行时创建的组件

来自分类Dev

在运行时转换类型数组

来自分类Dev

在运行时获取输入类型

来自分类Dev

在运行时定义的类型的列表

来自分类Dev

在运行时扩展类

来自分类Dev

在运行时更改Java类

来自分类Dev

在运行时动态创建类

来自分类Dev

在运行时扩展类

来自分类Dev

Scala类在运行时检查

来自分类Dev

在运行时更改Java类

来自分类Dev

在运行时更改继承类

来自分类Dev

在运行时生成类

来自分类Dev

在运行时替换导入类

来自分类Dev

在运行时分配无成员类型与在编译时分配绑定

来自分类Dev

在运行时动态创建和设置类的成员/属性

来自分类Dev

在运行时设置随机分布类成员的最小和最大范围?

来自分类Dev

类内成员初始化是在编译时还是在运行时进行?

来自分类Dev

春季:如何在运行时选择响应类型?

来自分类Dev

在运行时在Elixir中选择方法(函数指针类型)

来自分类Dev

在运行时在python中选择类的已执行方法?

来自分类Dev

在运行时选择要包含在dart类构造函数中的命名参数

来自分类Dev

Java-在运行时按参数类选择可调用方法的最佳选项

来自分类Dev

ES2015类型的数组是否在运行时堆中分配?

来自分类Dev

在运行时从指向基类的指针获取对象的类型

来自分类Dev

在运行时检查Glass Mapper V3类型

来自分类Dev

是否可以在运行时访问Java 8类型信息?

来自分类Dev

在运行时根据不同类型实例化模板类

来自分类Dev

如何在运行时使用类型定义具有内部类的类?