在运行时管理模板化函数的名称 - 可能吗?

时间:2016-01-19 22:53:47

标签: c++ symbols name-mangling

假设我已经编写了一个foo<T>函数(我有一个完整的名称空间签名),但现在没关系);并假设没有其他函数重载它(在相关的命名空间中)。现在让我们把自己放在运行时。假设我有字符串&#34; foo&#34;,对于某些类型MyType,我有typeid(MyType)(来自<memory>标题)。

我可以以某种方式获取foo<MyType>的符号名称吗?

这个问题的第二个版本:现在假设我将foo的完整签名作为字符串,而不仅仅是名称;并放弃没有超载的假设。

备注:

  • 不,我不是在问这个符号本身,而是在询问这个名字。那将是另一个有趣的问题。
  • 依赖于来自共享库的foo<T>的答案是相关的,但我不认为它只对符号 name 有用。
  • 我不关心这里的表现,我会尽一切努力。帮助我Obi Wan,你是我最后的希望等等。所以,RTTI,用奇怪的旗帜编译,无论如何。
  • 依赖于平台的答案也是相关的:GNU / Linux内核版本&gt; = 3.x,x86_64 CPU,gcc&gt; = 4.8。

1 个答案:

答案 0 :(得分:1)

不,你不能。

要获取实例化函数模板的受损名称,最简单的情况下需要以下信息:

  • 该函数的完全限定名称(您说您只有"foo",如果该函数位于命名空间中该怎么办?)
  • 所有模板类型参数的类型(类型的错位名称可能足够,如果函数名称的重整方案直接嵌入类型名称;否则您需要完整的类型名称,可能递归地进入该类型的所有模板参数。
  • 所有函数参数的类型(适用相同的警告)。

这假设您没有模板模板参数或非类型参数。当你拥有它们时会变得更加复杂,因为它可能需要整个表达式树的错位形式。它还假设您没有处理部分或完全显式特化,这更复杂。最后假设您的函数由于编译器特定的扩展(例如32位Windows环境中的__stdcall)而没有任何特殊装饰。哦,有些ABI也可以编码函数的返回类型。

因为根据你的前提,你只有函数名(不清楚它是否是完全限定的)和模板参数的type_id对象(可能作为受损类型的来源名称,但不是在所有平台上),您没有足够的信息来重新创建损坏的名称。

这样就可以选择从二进制文件中获取所有已编译符号的列表(如果可用)并搜索最可能的候选者,这当然容易出错。