如何编写一个简单的函数(在 C++ 17 中),它可以获取一个 QVector 任何类型,并返回一个具有转换后的值任何其他类型的新函数。例如:
auto my_function(auto in, auto f)
{
// ... body of function
}
// Usage:
auto my_lambda = [] (int x) { return QString::number(x); }
QVector<int> in_vector = {1,2,3};
QVector<QString> res = my_func(in_vector, my_lambda);
您实际上是在描述 std::transform,它实际上适用于 Qt 容器(或任何范围兼容的容器)。
如果您必须具有该签名,您的函数可以充当它的适配器。因为只有当你有一个正确的
auto
并且你仍然必须返回一些定义的对象时才能推断出 return
返回类型,所以使用尾随类型声明是更谨慎的,例如像这样的东西:
auto my_function(auto in, auto f)
-> QVector<std::remove_reference_t<decltype(f(*in.begin()))>>
{
// do your own loop or use std::transform
}
PS。如果这是一个公共接口,我只是不喜欢在函数代码中隐藏返回类型。 Ofc,您可以在主体内部声明类型,请参阅 Alex 的answer。
好吧,就这样吧
template<typename F>
auto my_map(const auto &data, F f)
{
using ReturnType = std::invoke_result_t<F, decltype(data.at(0))>;
QVector<ReturnType> res(data.size());
std::transform(data.begin(), data.end(), res.begin(), f);
return res;
}
它对于非空向量非常有效。
UPD:另一个工作变体:
auto my_map(const auto &data, auto f)
{
using ReturnType = decltype(f(data.at(0)));
QVector<ReturnType> res(data.size());
std::transform(data.begin(), data.end(), res.begin(), f);
return res;
}
为什么不使用
QVariant
的向量?当您需要访问数据时,类似于 QVector<QVariant> myVector
和 myVector.at(0).toInt()
或 myVector.at(0).toString()
。