我想编写一个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
的返回函数相同,以使此代码在一般情况下有效?
答案 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
进行简化。