我正在尝试构建一个包含其他类作为成员的模块化类,用户可以在运行时指定这些类的类型。我试图用模板来实现这一点,但意识到这可能不是正确的方法。这是一个最小的工作示例:
#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] 删除。
我来说两句