【发布时间】:2010-05-20 21:40:47
【问题描述】:
更新:经过一些额外的阅读,我真正想要的是保证早期绑定(应该转换为立即调用非虚拟函数和非 PIC 代码),这可以通过将(成员)函数作为模板参数传递。我遇到的问题是 gcc = 4,5 和 vs2008 可以很好地处理这些模板参数调用。
首先,也许 literals 不是这个概念的正确术语,但它是我能想到的最接近的术语(不是作为一等公民的功能意义上的字面量)。
这个想法是,当您进行常规函数调用时,它会编译成如下内容:
callq <immediate address>
但是如果你使用函数指针进行函数调用,它会编译成这样的:
mov <memory location>,%rax
callq *%rax
这一切都很好。但是,如果我正在编写一个模板库,它需要带有指定参数列表的某种回调,并且该库的用户应该知道他们想要在编译时调用什么函数?然后我想编写我的模板以接受 函数文字作为模板参数。 所以,类似于
template <int int_literal>
struct my_template {...};`
我想写
template <func_literal_t func_literal>
struct my_template {...};
并将 my_template 中对 func_literal 的调用编译为 callq <immediate address>。
C++ 中是否有为此提供的工具,或者是否有解决方法来实现相同的效果?如果没有,为什么不呢(例如一些灾难性的副作用)? C++0x 或其他语言怎么样?
【问题讨论】:
-
这个主题非常有用,因为它允许在运行时交换不同的功能。例如,DOS API 使用 ID 映射到函数。这允许 DOS 功能在对可执行文件的影响最小的情况下进行更改。只需更改查找表中的内容(函数地址)即可。
-
函子与模板的结合是编译时的。大多数 STL 都是这样工作的,或者您的问题是否有任何警告?
-
@pmr 警告是该解决方案应该对用户代码没有影响;如果他们不使用函数对象,我不想强迫他们使用函数对象。
-
@Thomas Matthews 我想你误解了我的意思,调用应该编译为
callq <immediate address>,应该有没有运行时灵活性。 -
@academicRobot:如果他们自己不使用函数对象,
boost::function(&foo)之类的技巧可以利用函数指针生成函数对象。
标签: c++ generics templates assembly