假设我已经编写了一个foo<T>
函数(我有一个完整的名称空间签名),但现在没关系);并假设没有其他函数重载它(在相关的命名空间中)。现在让我们把自己放在运行时。假设我有字符串&#34; foo&#34;,对于某些类型MyType
,我有typeid(MyType)
(来自<memory>
标题)。
我可以以某种方式获取foo<MyType>
的符号名称吗?
这个问题的第二个版本:现在假设我将foo的完整签名作为字符串,而不仅仅是名称;并放弃没有超载的假设。
备注:
foo<T>
的答案是相关的,但我不认为它只对符号 name 有用。答案 0 :(得分:1)
不,你不能。
要获取实例化函数模板的受损名称,最简单的情况下需要以下信息:
"foo"
,如果该函数位于命名空间中该怎么办?)这假设您没有模板模板参数或非类型参数。当你拥有它们时会变得更加复杂,因为它可能需要整个表达式树的错位形式。它还假设您没有处理部分或完全显式特化,这更复杂。最后假设您的函数由于编译器特定的扩展(例如32位Windows环境中的__stdcall
)而没有任何特殊装饰。哦,有些ABI也可以编码函数的返回类型。
因为根据你的前提,你只有函数名(不清楚它是否是完全限定的)和模板参数的type_id对象(可能作为受损类型的来源名称,但不是在所有平台上),您没有足够的信息来重新创建损坏的名称。
这样就可以选择从二进制文件中获取所有已编译符号的列表(如果可用)并搜索最可能的候选者,这当然容易出错。