我有一个type_info
对象,用于定义属性映射中的属性类型。我想运行一些代码(例如从cin读取值),使用我的type_info对象定义的类型进行参数化。它可能是一些模板功能,即:
template<typename T>
void do_something()
{
T a; cin >> a;
}
然后在代码的其他部分我想称之为:
const type_info &type_description = foo.get_type_of_something();
do_some_magic(do_something, type_description);
我正在寻找do_some_magic
函数,该函数调用do_something
专门针对type_descriptor
描述的类型。模板函数可以包含在某种结构中,没关系。
当然,只有预先定义的有限类型集合才有可能(因为必须在编译时为每个类型生成专门化)。
一种方法是制作一个if(type_descriptor==typeid(int)) /*...*/ else if(type_descriptor==...
链,依此类推,但这不是一个非常漂亮的解决方案(imo)。
我想知道是否有更清洁的解决方案?或者也许某些库(最好是“boost”)已经实现了这样的机制?
答案 0 :(得分:1)
type_info
对象为您提供有关运行时对象的信息。解决问题的唯一方法是将其与typeid
运算符与每种目标类型的结果进行比较。
由于您正在寻找漂亮的内容,因此您可以map
type_info
(实际上已经包裹)到(boost|std)::function<>
。
答案 1 :(得分:0)
在编译时知道类型的简单情况是使用函数重载:
RETURN_TYPE_1 do_something_magic(TYPE_1) { ... }
RETURN_TYPE_2 do_something_magic(TYPE_2) { ... }
...
do_something_magic(foo); //只是按预期工作
只要您在编译时知道它们的类型,就可以将技巧扩展到多个参数。
如果你想基于ONE参数类型调度dynamicaly,为了获得类型信息你必须使用动态多态,然后只需使用RTTI和C ++的本机能力根据第一个类型签名进行调度,上面的代码如果你有一个虚拟析构函数(非平凡的析构函数)并且返回类型对于每个重载函数都是相同的,那么它仍然是一个好的。
如果你想基于几种参数类型调度dynamicaly,关注点是完全不同的,你必须使用一种技术知道为Mutimethod,它在维基百科上有很好的解释,而boost提供了一个实现。