gpt4 book ai didi

c++ - 运行时创建的模板类的调用函数

转载 作者:行者123 更新时间:2023-11-30 01:53:18 26 4
gpt4 key购买 nike

我有一个关于 C++(11) 模板类及其在运行时确定类型的实例化的棘手问题:

以下场景:用户使用配置文件(ROS 参数)定义模板类的类型。这仅确定模板类的类型,而不是进一步的逻辑:

类定义:

template<typename T>
class MyClass {
//[...]
}

示例代码:

/* [Read parameter and write result to bool use_int] */

std::unique_ptr<MyClass> myclassptr {nullptr};
if(use_int) {
myclassptr.reset(MyClass<int>);
} else {
myclassptr.reset(MyClass<double>);
}

myclassptr->foobar();

/* [more code making use of myclassptr] */

所以这段代码(当然)不能编译,因为 unique_ptr 模板也必须用模板类型指定。然而,随之而来的问题是,使用 reset 分配的所有对象的模板类型必须相同。

一个丑陋的解决方案是将代码 myclassptr->foobar(); 和以下代码复制到 if/else 的每个分支中,我真的不喜欢这样。

我希望看到类似这样的解决方案:

/* [Read parameter and write result to bool use_int] */

MyClass<use_int ? int : double> myclass;
myclass.foobar();

到目前为止,我读到的是这样的事情也是不可能的。

有人对此有好的解决方案吗?

最佳答案

最简单的方法是:

class IClass{
virtual ~IClass {}
virtual void foobar()=0;
};
template<typename T>
class MyClass:public IClass {
public:
void foobar() override {
// code here
}
};
std::unique_ptr<IClass> myclassptr {};
if(use_int) {
myclassptr.reset(new MyClass<int>());
} else {
myclassptr.reset(new MyClass<double>());
}
myclassptr->foobar();

boost::variant 是另一种解决方案,但通常用于不相关的类型。可以进行类型删除,但当您有不相关的类型并希望对其施加统一接口(interface)时,通常会再次进行删除。

在其他语言中,泛型看起来有点像模板,但实际上是一个带有自动生成的类型转换和一些类型检查的抽象接口(interface)。 C++ template 是函数或类编译时工厂。默认情况下,此类工厂的两个输出在运行时是不相关的,您可以根据需要添加此类关系。

关于c++ - 运行时创建的模板类的调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23265035/

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