接受任何 Qt 容器作为输入参数

Accepting any Qt container as input parameter

我有一个将值集合作为输入参数的方法:

void doSomething(QVector<int> const &values) {
    for(auto v : values) {
        // Do something.
    }
}

有时,我想传递给方法的值在 QSet 而不是 QVector 中。由于 doSomething 只是遍历值集合,我不想创建一个包含 QSet 值的新 QVector 只是为了能够将它传递给 DoSomethingdoSomething(QVector<int>(set.begin(), set.end()))。我希望能够直接传递 QSetdoSomething(set)。我怎样才能做到这一点?

我考虑过让 doSomething 接受一对迭代器而不是集合本身,但后来我 运行 遇到了同样的问题:如何让它同时接受 QVector::iteratorQList::iterator?

现在,如果值在 QHash 中怎么办?相同的方法可以接受参数 QVectorQSetQHash 吗?

既然你想要的东西可以接受多个不通过继承相关的类型,就把它做成一个模板。

template <typename Container>
void doSomething(Container const& c)
{
    for (auto v : c) {
        // do something
    }
}

将适用于具有合适的 begin()end() 方法(或 begin(Container)end(Container) 重载)的任何类型 Container

如果您想改为接受迭代器(因为它更灵活一些,只允许对容器的某些子集进行操作)...改为将其模板化为迭代器类型。


请注意,如果您想将容器限制为存储 int - 而不是直接执行此操作要容易得多。

直接方法是使 Container 成为模板模板参数,函数参数成为 Container<int> ... 但这对于 std::vector<int> 这样的容器来说效果不佳,它有一个额外的 allocator 类型参数(它是默认的,但仍然存在)。

更好的方法是使用SFINAE或static_assert来表达你真正关心的约束,例如std::is_integral<typename Container::value_type>std::is_same<int, value_type>等(默认类型参数的数量Container takes 并不是其中之一)。