我想编写一个简单的函数来简化std::transform以便在单个 vector 上进行转换。

到目前为止,我得到的是:

template<typename T>
void transform(std::vector<T> &vec, const std::function<T(const T &)> &fun) {
  std::transform(std::begin(vec), std::end(vec), std::begin(vec), fun);
}

现在,当我想使用此功能时,可以编写例如:
transform<int>(vec, my_function);

但是我更愿意只使用
transform(vec, my_function);

有没有办法调整我的代码以自动推断类型?

错误:

最佳答案

似乎您使用lambda作为参数; lambda可以转换为std::function,但是在template argument deduction中将不考虑隐式转换,这就是它失败的原因。



您可以在传递时明确使用static_cast将lambda转换为std::function,或停止使用std::function。例如

template<typename T, typename F>
void transform(std::vector<T> &vec, F fun) {
  std::transform(std::begin(vec), std::end(vec), std::begin(vec), fun);
}

关于c++ - 简化单个 vector 的std::transform,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52905080/

10-13 00:04
查看更多