假设我有一个函数模板,该模板接受任意函数对象作为参数:
template<typename F>
// func is a function object
void do_something(F func) {
// Do something with func
}
我还有一个普通的功能:
int f(int x) {
return 2 * x;
}
我想将f
作为参数传递给do_something
。但是,当我这样做时,do_something
被F = int (*)(int)
实例化,并且在func
内部对do_something
的调用导致通过函数指针进行运行时间接访问。我想要的是专门实例化do_something
来调用f
,而不是实例化具有相同签名的函数。我可以使用lambda表达式来实现:
do_something([](int x) -> int { return f(x); });
在这种情况下,将do_something
实例化为新的闭包类型F
,并且在运行时不会发生指针间接调用。但是这段代码看起来并不好。有没有更优雅的方法可以实现这一目标?