考虑下面的代码示例:
template <typename... TArgs>
void foo(std::function<void(TArgs...)> f) {
}
template <typename... TArgs>
class Class {
public:
static void foo(std::function<void(TArgs...)> f) {
}
};
为什么我可以做这个:
int main() {
// Helper class call
Class<int, int>::foo(
[](int a, int b) {}
);
}
但是我这样做会得到一个编译错误:
int main() {
// Function call
foo<int, int>(
[](int a, int b) {}
);
}
<source>:16:5: error: no matching function for call to 'foo'
foo<int, int>(
^~~~~~~~~~~~~
<source>:4:6: note: candidate template ignored: could not match
'std::function<void (int, int, TArgs...)>' against
'(lambda at <source>:17:9)'
void foo(std::function<void(TArgs...)> f) {
^
我只想要一个方便的方法来使用像
foo
这样的函数。我已经尝试过这个:
std::function<void(int, int)> f = [](int a, int b) {
};
foo<int, int>(f); // ok
它有效了。这没问题。但我想知道是否有一种方式可以在函数调用中直接使用lambda,而无需创建本地函数对象。
static_cast<void(*)(std::function<void(int, int)>)>(&foo)([](int, int){});
- Jarod42