假设我写了一个foo< T> function(我有一个带有命名空间的完整签名),但现在没关系);并假设没有其他函数重载它(在相关的命名空间中).现在让我们把自己放在运行时.假设我有字符串“foo”,对于某些类型MyType,我有typeid(MyType)(来自< memory>标头).
我可以以某种方式获取foo< MyType> ;?的符号名称吗? 这个问题的第二个版本:现在假设我将foo的完整签名作为字符串,而不仅仅是名称;并放弃没有超载的假设. 笔记:
>不,我不是在问这个符号本身,而只是这个名字.这将是另一个有趣的问题.
>依赖于foo< T>的答案来自共享库是相关的,虽然我不认为它只对符号名称有用.
>我不关心这里的表现,我会尽一切可能.帮助我欧比万,你是我最后的希望等等.所以,RTTI,用奇怪的旗帜编译,无论如何.
>与平台相关的答案也是相关的:GNU / Linux内核版本> = 3.x,x86_64 CPU,gcc> = 4.8.
最佳答案 不,你不能.
要获取实例化函数模板的错位名称,最简单的情况是需要以下信息:
>函数的完全限定名称(你说你只有“foo”,如果函数在命名空间中怎么办?)
>所有模板类型参数的类型(类型的错位名称可能就足够了,如果函数名称的修改方案直接嵌入类型名称;否则您需要完整的类型名称,可能递归到所有模板参数中类型).
>所有函数参数的类型(同样需要注意).
这假设您没有模板模板参数或非类型参数.当你拥有它们时会变得更加复杂,因为它可能需要整个表达式树的错位形式.它还假设您没有处理部分或完全显式特化,这更复杂.最后假设您的函数由于编译器特定的扩展(例如32位Windows环境中的__stdcall)而没有任何特殊装饰.哦,一些ABI也可以编码函数的返回类型.
因为根据你的前提,你只有函数名称(不清楚它是否是完全限定的)和模板参数的type_id对象(它可以作为受损类型名称的来源,但不在所有平台上),您没有足够的信息来重新创建受损的名称.
这样就可以选择从二进制文件中获取所有已编译符号的列表(如果可用)并搜索最可能的候选者,这当然容易出错.