加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:15:18 所属栏目:百科 来源:网络整理
导读:假设我写了一个foo T function(我有一个带有命名空间的完整签名),但现在没关系);并假设没有其他函数重载它(在相关的命名空间中).现在让我们把自己放在运行时.假设我有字符串“foo”,对于某些类型MyType,我有typeid(MyType)(来自 memory标头). 我可以以某种方
假设我写了一个foo< T> function(我有一个带有命名空间的完整签名),但现在没关系);并假设没有其他函数重载它(在相关的命名空间中).现在让我们把自己放在运行时.假设我有字符串“foo”,对于某些类型MyType,我有typeid(MyType)(来自< memory>标头).

我可以以某种方式获取foo< MyType&gt ;?的符号名称吗? 这个问题的第二个版本:现在假设我将foo的完整签名作为字符串,而不仅仅是名称;并放弃没有超载的假设. 笔记:
>不,我不是在问这个符号本身,而只是这个名字.这将是另一个有趣的问题.
>依赖于foo< T>的答案来自共享库是相关的,虽然我不认为它只对符号名称有用.
>我不关心这里的表现,我会尽一切可能.帮助我欧比万,你是我最后的希望等等.所以,RTTI,用奇怪的旗帜编译,无论如何.
>与平台相关的答案也是相关的:GNU / Linux内核版本> = 3.x,x86_64 CPU,gcc> = 4.8.

解决方法

不,你不能.

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

>函数的完全限定名称(你说你只有“foo”,如果函数在命名空间中怎么办?)
>所有模板类型参数的类型(类型的错位名称可能就足够了,如果函数名称的修改方案直接嵌入类型名称;否则您需要完整的类型名称,可能递归到所有模板参数中类型).
>所有函数参数的类型(同样需要注意).

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读