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

#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;
}


但是,我该如何决定应该使用哪个子模块呢?例如,如果用户要使用分频和加法,则必须将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>());

关于c++ - 在运行时选择类(class)成员的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52220979/

10-11 22:45
查看更多