使用模板将lambda解析为函数

时间:2019-06-03 23:28:31

标签: c++ templates lambda

我对C ++还是很陌生,目前正在尝试学习如何将模板用于lambda函数。

可以在main函数中看到lambda,它只是进行布尔检查。

下面的实现有效,但是我必须在testing函数中明确声明lambda的类型,如输入参数所示。

void testing(std::function<bool(const int& x)> predicate){
    auto a = predicate(2);
    std::cout << a << "\n";
}

int main() {
    int ax = 2;
    testing([&ax](const int& x) { return x == ax;});
}

我希望实现一个可以利用如下所示的模板的实现,但是我什么也无法工作。

template <typename T>
void testing(std::function<bool(const T& x)> predicate){
    auto a = predicate(2);
    std::cout << a << "\n";
}

有没有一种通用的方法可以将模板用于lambda?

1 个答案:

答案 0 :(得分:5)

不要将模板参数包装在std::function中。

将lambda传递给函数的最佳方法是将其作为不受约束的模板参数:

template<class F>
void testing(F predicate) {
    auto a = predicate(2); 
    std::cout << a << '\n';
}

int main() {
    int ax = 2;
    testing([ax](int x) { return x == ax; }); 
}

受益于std::function

  • std::function在堆上分配空间以存储函子
  • std::function的开销类似于虚拟函数调用
  • std::function不能由编译器内联,但是内联直接传递的lambda很简单