有一个答案解释了为什么 std::find_if 采用 value 谓词。
但是如果我定义自己的函数并将谓词作为参数怎么办?
例如,考虑以下为每个元组元素调用给定函数的函数:
template <typename... Args, typename Func, std::size_t... index>
constexpr void for_each(const std::tuple<Args...>& t, Func&& f, std::index_sequence<index...>)
{
(f(std::get<index>(t)), ...);
}
template <typename... Args, typename Func>
constexpr void for_each(const std::tuple<Args...>& t, Func&& f)
{
for_each(t, f, std::index_sequence_for<Args...>{});
}
这段代码中f
是通过右值引用传递的,这是正确的方法吗?
使用示例:
auto t = std::make_tuple(5, std::string(""));
for_each(t, [](auto& field)
{
std::cout << field << std::endl;
});
不应该有吗const Func&
?
它实际上是通过“转发引用”传递的。
是的,如果您希望人们传递复制成本高昂的复杂对象,那很好。我也会默认这一点。