C++;如何将函数应用于向量元素 我想写一个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; } 模板 T变换_向量(常数T和输入,一元运算符op) { T输出; std::transform(input.begin()、input.end()、std::back_插入器(output)、op); 返回输出; }

C++;如何将函数应用于向量元素 我想写一个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; } 模板 T变换_向量(常数T和输入,一元运算符op) { T输出; std::transform(input.begin()、input.end()、std::back_插入器(output)、op); 返回输出; },c++,c++11,templates,vector,transform,C++,C++11,Templates,Vector,Transform,如果函数op返回类型与T相同,则此代码有效。有没有办法告诉编译器输出向量的类型与op的返回函数相同,以使此代码在一般情况下工作 有没有办法告诉编译器输出向量的类型与op的返回函数相同,从而使此代码在一般情况下工作 --编辑--标准::衰变系统地添加在Barry的评论之后(谢谢!) 我想是这样的(如果你能使用C++14) 另一种从C++11开始工作并避免冗余的方法是使用默认值传递第三个模板类型参数 它有点复杂,但I(IMHO)更有趣,因为它允许通过decltype()避免自动推断,并强制使用不同的

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

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

--编辑--
标准::衰变
系统地添加在Barry的评论之后(谢谢!)

我想是这样的(如果你能使用C++14)

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

它有点复杂,但I(IMHO)更有趣,因为它允许通过
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;
}
模板
RetV变换_向量(T常量和输入,UO运算)
{
电视输出;
std::transform(input.begin(),input.end(),
std::背面插入器(输出),op);
返回输出;
}
这也适用于C++11


从C++14开始,您可以使用
std::detaci\t
代替
typename std::detaci::type

您可以在它工作的地方添加一些代码,在它不工作的地方添加一些代码,以更好地说明您需要解决的问题吗?您的解决方案总体上是有效的(刚刚用C++14进行了测试)。Thanks@motam79-答案用另一种方法改进(稍微复杂一点,但(IMHO)更好),没有冗余,应该从C++11开始工作。太棒了,我不知道可以在模板中定义另一个“派生类型”<…>。如果将空向量传递给函数,它也会起作用。您需要将
std::decation\t
添加到调用
op
@Barry的结果中-显然,您是对的。但是我的大脑不可能习惯于
std::decay
。谢谢
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;
}
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;
}