【发布时间】:2014-04-24 09:32:05
【问题描述】:
我有一个关于 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();
到目前为止,我所读到的是,这样的事情也是不可能的。
有人对此有很好的解决方案吗?
【问题讨论】:
-
也许是一个通用的基类:
template <typename T> class MyClass : public IClass; -
这就是接口的用途。
标签: c++ class templates c++11 late-binding