0

我有一个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_somethingtype_descriptor. 模板函数可以包装成某种结构,没关系。

当然,它只能用于预先定义的有限类型集(因为必须在编译时为每个类型生成特化)。

一种方法是制作一个链if(type_descriptor==typeid(int)) /*...*/ else if(type_descriptor==...等,但这不是非常漂亮的解决方案(imo)。

我想知道是否存在更干净的解决方案?或者也许某些库(最好是“boost”)已经实现了这种机制?

4

2 回答 2

1

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

由于您正在寻找漂亮的东西,您可以将 a mapof type_info(wrapped, 实际上) 设置为 (boost|std)::function<>s。

于 2012-05-28T22:02:30.480 回答
0

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

RETURN_TYPE_1 do_something_magic ( TYPE_1 ) { ... }

RETURN_TYPE_2 do_something_magic (TYPE_2) { ... }

...

do_something_magic ( foo ); // 按预期工作

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

如果要基于 ONE 参数类型动态分派,为了获得类型信息,您必须使用动态多态性,然后只需使用 RTTI 和 C++ 的原生能力基于第一个类型签名进行分派,上面的代码仍然是好的,前提是您有一个虚拟析构函数(非平凡析构函数)并且每个重载函数的返回类型都相同。

如果你想基于几种参数类型动态地调度,关注点是完全不同的,你必须使用一种称为 Mutimemethod 的技术,它在 Wikipedia 上有很好的解释,boost 提供了一个实现。

于 2012-05-28T23:45:17.347 回答