C++ 基于type_info对象的专门化代码

C++ 基于type_info对象的专门化代码,c++,boost,generic-programming,typeinfo,C++,Boost,Generic Programming,Typeinfo,我有一个type\u info对象,它定义了我的属性映射中的属性类型。我想运行一些代码(例如,从cin读取值),这些代码使用我的type_info对象定义的类型参数化。它可以是一些模板函数,即: template<typename T> void do_something() { T a; cin >> a; } 我正在寻找dosome\u magic函数,该函数调用dou something专门用于type\u descriptor描述的类型。模板函数可以封装在某

我有一个
type\u info
对象,它定义了我的属性映射中的属性类型。我想运行一些代码(例如,从cin读取值),这些代码使用我的type_info对象定义的类型参数化。它可以是一些模板函数,即:

template<typename T>
void do_something()
{
  T a; cin >> a;
}
我正在寻找
dosome\u magic
函数,该函数调用
dou something
专门用于
type\u descriptor
描述的类型。模板函数可以封装在某种结构中,这无关紧要

当然,这只适用于预先定义的有限类型集(因为必须在编译时为每个类型生成专门化)

一种方法是创建一个
if(type\u descriptor==typeid(int))/*…*/else-if(type\u descriptor==…
等的链,但这不是很好的解决方案(imo)


我想知道是否有更干净的解决方案?或者一些库(“boost”更好)已经实现了这样的机制?

一个
type_info
对象在运行时向您提供有关对象的信息。您问题的唯一解决方案是将其与
typeid
操作符对每个目标类型的结果进行比较


由于您正在寻找漂亮的东西,您可以将
type_info
(实际上是包装的)映射到
(boost | std)::function
s.

编译时知道类型的简单情况是使用函数重载:

RETURN\u TYPE\u 1 dou\u something\u magic(TYPE\u 1) { ... }

RETURN\u TYPE\u 2 dou\u something\u magic(TYPE\u 2) { ... }

做些神奇的事(foo)//就像预期的那样

只要在编译时知道多个参数的类型,就可以将该技巧扩展到多个参数

如果你想根据一个参数类型动态调度,为了拥有类型信息,你必须使用动态多态性,然后简单地使用RTTI和C++的本地能力根据第一个类型签名来调度,如果你有一个虚拟析构函数(非平凡析构函数),上面的代码仍然是很好的。每个重载函数的返回类型都是相同的


如果您想基于多种参数类型分派DynamicCaly,关注点是完全不同的,您必须使用称为Mutimethod的技术,这在Wikipedia上有很好的解释,boost提供了一个实现。

我怀疑如果我们知道您真正想要做什么,我们会建议您使用类型擦除…甚至可能是
boost::变体
。。。
const type_info &type_description = foo.get_type_of_something();
do_some_magic(do_something, type_description);