c++ - 在运行时选择类成员的类型

标签 c++ class templates metaprogramming

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

#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 和 Add,我必须将 Module1 创建为

Module1<Divide, Add> module1;

会有很多不同的子模块,所以用 if 分支代码也是不可能的。我开始怀疑模板是否可行。你知道更好的方法来完成这个吗?请注意,实现也应该非常高效。

最佳答案

模板用于编译时多态性,而您需要运行时多态性。

如果你有一组可能的子模块,你可以使用 std::variant .它基本上是一个类型安全的 union:

using SubmoduleVariant = std::variant<Add, Subtract, Multiply, Divide>;

class Module1 {
public:
    SubmoduleVariant subModule1;
    SubmoduleVariant subModule2;
};

// ...

Module1 m;

     if(userInput == 0) { m.subModule1 = Add{}; }
else if(userInput == 1) { m.subModule1 = Subtract{}; }
else if(userInput == 2) { m.subModule1 = Multiply{}; }
else if(userInput == 3) { m.subModule1 = Divide{}; }

如果您事先不知道可能的类型集,但它们都符合相同的接口(interface),您可以使用函数和一个基类。


如果你事先不知道可能类型的集合,而且它们不符契约(Contract)一个接口(interface),你可以使用std::any ,它基本上是对“任何类型的对象”的包装。

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

相关文章:

vb.net - 如何将 "sub property"添加到类属性

模板调用中的 C++ 模板

c# - 在 C# 中减少代码复制的惯用方法

c++ - 将元素添加到已排序的链表 C++ 时出现问题

javascript - 在 JavaScript 中向 "Class"添加属性

c++ - 使用不带缓冲区变量的sprintf

c++ - QPixmap 图像文件未出现在 QGraphicsScene 上

c++ - 如何为现有的 git 项目设置 codelite

python - Discord 机器人引发类类型错误

c++ - [C++][std::sort] 它如何在 2D 容器上工作?