C ++如何将函数应用于向量元素

时间:2018-02-07 02:44:00

标签: c++ c++11 templates vector transform

我想编写一个C ++函数来在向量上应用(lambda)函数并返回另一个相同大小的向量:

template <class T, class UnaryOperator>
T transform_vector(const T& input, UnaryOperator op)
{
    T output;
    std::transform(input.begin(), input.end(), std::back_inserter(output), op);
    return output;
}

如果函数op返回类型与T相同,则此代码有效。是否有办法告诉编译器输出向量的类型与op的返回函数相同,以使此代码在一般情况下有效?

1 个答案:

答案 0 :(得分:2)

  

有办法告诉编译器输出向量的类型与op的返回函数相同,以使此代码在一般情况下工作吗?

- 编辑 - std::decay<>系统地添加了Barry的评论(谢谢!)

我想类似的东西(如果你可以使用C ++ 14)

template <class T, class UnaryOperator>
auto transform_vector(const T& input, UnaryOperator op)
{
    std::vector<std::decay_t<decltype(op(*input.begin()))>> output;
    std::transform(input.begin(), input.end(), 
                   std::back_inserter(output), op);
    return output;
}

对于C ++ 11来说有点复杂(多余),因为你不能简单地使用auto作为返回类型

template <class T, class UnaryOperator>
auto transform_vector(const T& input, UnaryOperator op)
   -> std::vector<typename std::decay<decltype(op(*input.begin()))>::type>
{
    std::vector<typename std::decay<decltype(op(*input.begin()))>::type>
       output;
    std::transform(input.begin(), input.end(), 
                   std::back_inserter(output), op);
    return output;
}

另一种方法,从C ++ 11开始并避免冗余,使用默认值传递第三个模板类型参数。

这有点复杂,但我(恕我直言)更有趣,因为允许通过decltype()避免自动扣除并强加不同的返回类型。

template <typename T, typename UO,
   typename RetV = std::vector<typename std::decay<decltype(std::declval<UO>()
                                        (*std::declval<T>().begin()))>::type>>
RetV transform_vector (T const & input, UO op)
{
    RetV output;
    std::transform(input.begin(), input.end(), 
                   std::back_inserter(output), op);
    return output;
}

这也适用于C ++ 11。

从C ++ 14开始,您可以使用std::decay_t<T>代替typename std::decay<T>::type进行简化。