gpt4 book ai didi

c++ - 在运行时有条件地定义 3 个类中的哪一个将用于其余 C++ 代码

转载 作者:行者123 更新时间:2023-11-30 02:28:24 26 4
gpt4 key购买 nike

这是我在 C++ 中尝试做的事情。从我使用的外部库中,我有 3 个类,MyClass1MyClass2MyClass3,它们的公共(public)函数相同。我想在运行时开始时根据用户的硬件配置决定在我的其余代码中使用哪一个。

为了更好地说明我的意思,让我举一个我知道行不通的例子。 如果有可能在运行时有条件地定义一个typedef,我试图实现的如下所示:

const int x = GetX(); //where GetX() is any function that calculates the value of x
typedef std::conditional<x > 0, MyClass1,
std::conditional< x < 0, MyClass2,
MyClass3>::type>::type TheClass;

因此,在其余代码中,我将只引用 TheClass,这样一来,它是否别名 MyClass1 都无关紧要MyClass2MyClass3

但是,上面的代码当然不起作用,因为当 x 从运行时开始执行的函数计算出它的值时,std::conditional 会报错x 不是常数。这是有道理的,因为 typedef 不能在运行时定义。

所以,我的问题是:有没有办法实现我想要做的事情(不是 typedef 因为我知道它不能在运行时定义)?请记住,MyClass1MyClass2MyClass3 是由库从外部提供的,而且我无法轻易更改它们。

最佳答案

我能看到的唯一解决方案是使用模板为您生成代码。模语法错误,你的std::conditional如果您将 x 转换为编译器已知的值,则基于解决方案确实有效。诀窍是将所有使用 typedef 的代码包装在一个模板函数/类中,该函数/类将整数作为模板参数,如:

template <int x>
void myMain(){
using TheClass = typename std::conditional<x == 0, MyClass1, MyClass2>::type;

然后你要确保你编译了所有的变体(在我的例子中是 0 和非零)并且你明确地调用了 myMain<0>()。并且,比如说,myMain<1>() ,如:

if(x == 0){
myMain<0>();
}
else{
myMain<1>();
}

现在您已经将条件转换为在运行时评估的东西,但是您已经编译了两种情况的代码并且您可以执行它们中的每一个(或两者)以满足您的需求。

这有一个缺点,那就是将使用该类的任何东西都变成模板或模板调用的东西。除了"dispatch"点之外,我建议在类型上而不是在整数上成为模板(参见示例中的函数 doSomethingWithClass);这更好地表达了这样一个事实,即您的代码可以使用您要实例化它的所有类型。如果你想确保你只能用你感兴趣的三个类实例化函数,你应该考虑使用 CRTP 模式(奇怪的重复模板参数)。

另一方面,这具有优势(相对于基于多态性的其他答案)您可以使用堆栈而不是堆。

您可以找到一个工作示例 here .

希望对您有所帮助。

关于c++ - 在运行时有条件地定义 3 个类中的哪一个将用于其余 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40781984/

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