考虑下一个代码示例:
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) {}
);
}
但我在执行此操作时遇到编译错误:
一个二个一个一个
我只是想有一个方便的方法来使用foo
这样的函数。
我试过这个:
std::function<void(int, int)> f = [](int a, int b) {
};
foo<int, int>(f); // ok
它成功了,这没问题,但我想知道是否有办法,在函数调用中直接使用lambdas,而不用创建局部函数对象。
1条答案
按热度按时间myzjeezk1#
正因如此:Why is template parameter pack used in a function argument type as its template argument list not able to be explicit specified
当你调用
foo<int, int>([](int a, int b) {});
时,包TArgs
仍然被推导出来,以防它需要被扩展。std::function<void(TArgs...)>
不能推导出任何带有lambda参数的TArgs...
,所以它被推导为一个空包,这与给定的int, int
冲突。对于
Class<int, int>::foo
,没有模板参数推导,因为模板参数已经给定。解决这个问题的一个办法是把它放在一个非演绎的上下文中:
或者根本不使用
std::function
: