【发布时间】:2020-08-30 22:55:57
【问题描述】:
我很难想象模板无法涵盖的std::function 的真正用例。每次考虑使用std::function,都会想办法避免:
// implementation using std::function
void forEach(std::array<int, 100> &data, const std::function<void(int&)> &f)
{
for (size_t i = 0; i < 100; ++i) {
f(data[i]);
}
}
// implementation using any functor which takes an int&
template <typename Callable>
void forEach(std::array<int, 100> &data, const Callable &f)
requires std::is_invocable_v<Callable, int&>
{
for (size_t i = 0; i < 100; ++i) {
f(data[i]);
}
}
诚然,使用std::function 的实现要短一些,但由于类型擦除,每次迭代都需要一个虚拟调用,编译器不能很好地优化它。 (Live example)
那么std::function 的真正用例是什么,不能使用模板代替?有必要std::function吗?
【问题讨论】:
-
“我很难想象一个模板无法涵盖的 std::function 的真正用例。”尝试实现相同的功能,但是当您稍后存储和调用时 - “回调”。你会看到区别。
标签: c++ templates std std-function