如果你知道在编译时的专业化,你只需要通过类型信息:
void inlined_function() {}; // function you want to pass
template<typename F> void caller1() {
inlined_function(); // not passed through pointer, call inline
}
如果您有内联函数的控制,实现它作为一个函子:
struct X {
inline void operator()() // inline function
{
}
};
template<typename F> void caller2(F functor) {
functor(); // inline call
}
客户代码为两种变体:
caller1<inlined_function>();
caller2(X{});
编辑:
如果您没有控制权将函子作为结构写入,请为其编写一个内联结构包装器。例如,你有void inlined_function() {};
,需要写caller2
在这种情况下,写类似X
调用inlined_function
,或(更好的)算符,拉姆达:
template<typename F> void caller2(F functor) {
functor(); // inline call
}
caller2([](){ inlined_functor(); });
嘿,我喜欢你的想法编辑。所以inlined_functor()也可以有inlined_functor2(),这些仍然是同一类中的普通方法? – user997112 2014-11-24 10:55:35
@ user997112 - 是的。内联函数互相调用将导致内联操作。 – utnapistim 2014-11-24 11:33:15