接受任何 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
只是为了能够将它传递给 DoSomething
:doSomething(QVector<int>(set.begin(), set.end()))
。我希望能够直接传递 QSet
:doSomething(set)
。我怎样才能做到这一点?
我考虑过让 doSomething
接受一对迭代器而不是集合本身,但后来我 运行 遇到了同样的问题:如何让它同时接受 QVector::iterator
和QList::iterator
?
现在,如果值在 QHash
中怎么办?相同的方法可以接受参数 QVector
、QSet
或 QHash
吗?
既然你想要的东西可以接受多个不通过继承相关的类型,就把它做成一个模板。
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 并不是其中之一)。
我有一个将值集合作为输入参数的方法:
void doSomething(QVector<int> const &values) {
for(auto v : values) {
// Do something.
}
}
有时,我想传递给方法的值在 QSet
而不是 QVector
中。由于 doSomething
只是遍历值集合,我不想创建一个包含 QSet
值的新 QVector
只是为了能够将它传递给 DoSomething
:doSomething(QVector<int>(set.begin(), set.end()))
。我希望能够直接传递 QSet
:doSomething(set)
。我怎样才能做到这一点?
我考虑过让 doSomething
接受一对迭代器而不是集合本身,但后来我 运行 遇到了同样的问题:如何让它同时接受 QVector::iterator
和QList::iterator
?
现在,如果值在 QHash
中怎么办?相同的方法可以接受参数 QVector
、QSet
或 QHash
吗?
既然你想要的东西可以接受多个不通过继承相关的类型,就把它做成一个模板。
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 并不是其中之一)。