【发布时间】:2014-11-24 10:31:07
【问题描述】:
在不使用函数指针的情况下,将函数(具有相同的输入参数/返回类型)作为参数传递给另一个函数的正确方法是什么?我希望传入的函数参数在调用时被内联?好吧,我只是不想要指针间接。
我发现了这个:
Pass a function as an explicit template parameter
但它似乎在使用函数指针。
编辑:我真的很想避免创建结构来存储每个函数参数的行为。
【问题讨论】:
在不使用函数指针的情况下,将函数(具有相同的输入参数/返回类型)作为参数传递给另一个函数的正确方法是什么?我希望传入的函数参数在调用时被内联?好吧,我只是不想要指针间接。
我发现了这个:
Pass a function as an explicit template parameter
但它似乎在使用函数指针。
编辑:我真的很想避免创建结构来存储每个函数参数的行为。
【问题讨论】:
如果你在编译时知道特化,你只需要传递类型信息:
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,或者(更好)一个lambda:
template<typename F> void caller2(F functor) {
functor(); // inline call
}
caller2( [](){ inlined_functor(); } );
【讨论】: