如何将 QVector 转换为另一个不同类型的

问题描述 投票:0回答:3

如何编写一个简单的函数(在 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);
c++ qt c++17 qvector
3个回答
2
投票

您实际上是在描述 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


1
投票

好吧,就这样吧

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;
}

0
投票

为什么不使用

QVariant
的向量?当您需要访问数据时,类似于
QVector<QVariant> myVector
myVector.at(0).toInt()
myVector.at(0).toString()

© www.soinside.com 2019 - 2024. All rights reserved.