更新:在进一步阅读后,我真正想要的是保证早期绑定(这应该被翻译为非虚函数和非PIC代码的立即调用),这可以通过将(成员)函数作为模板参数传递来实现。我的问题是gcc < 4.5和icc 11.1可以为成员函数指针模板参数调用生成一些奇怪的指令。据我所知,gcc >= 4.5和vs2008可以很好地处理这些模板参数调用。
首先,也许“字面值”不是这个概念的正确术语,但这是我能想到的最接近的术语(不是指函数作为一等公民的文字意义)。
这个想法是,当你进行传统的函数调用时,它编译成类似这样的东西:
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 {...};
我希望在我的模板中调用func_literal函数时,能够编译成callq <immediate address>
。是否有C++的相关功能或者解决方法来实现这个效果?如果没有,为什么没有(例如会产生灾难性的副作用)?C++0x或其他语言呢?
callq <立即地址>
,在运行时不应该有任何灵活性。 - academicRobotboost::function(&foo)
这样的技巧可以将函数指针转换为函数对象。 - MSalters