C++ 接受任何Qt容器作为输入参数
我有一个方法,它将一组值作为输入参数:C++ 接受任何Qt容器作为输入参数,c++,qt,containers,C++,Qt,Containers,我有一个方法,它将一组值作为输入参数: void doSomething(QVector常量和值){ 用于(自动v:值){ //做点什么。 } } 有时,我想传递给方法的值是QSet中的值,而不是QVector。由于doSomething只是对值集合进行迭代,因此我不想创建一个包含QSet值的新QVector,只是为了能够将其传递给doSomething:doSomething(QVector(set.begin(),set.end())。我希望能够直接通过QSet:doSomething(s
void doSomething(QVector常量和值){
用于(自动v:值){
//做点什么。
}
}
有时,我想传递给方法的值是QSet
中的值,而不是QVector
。由于doSomething
只是对值集合进行迭代,因此我不想创建一个包含QSet
值的新QVector
,只是为了能够将其传递给doSomething
:doSomething(QVector(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
}
}
模板
无效剂量测定(容器常数和c)
{
用于(自动v:c){
//做点什么
}
}
对于具有合适的begin()
和end()
方法(或begin(Container)
和end(Container)
重载)的任何类型的Container
都可以正常工作
如果您想接受迭代器(因为它更灵活,只允许对容器的某些子集进行操作)。。。改为在迭代器类型上对其进行模板化
请注意,如果您希望将容器约束为(例如)存储
int
,则不直接执行此操作要容易得多
直接的方法是将容器
设为模板参数,函数参数设为容器
。。。但是对于像std::vector
这样的容器来说,这并不能很好地工作,因为它有一个额外的分配器
类型参数(它是默认的,但仍然存在)
更好的方法是使用SFINAE或
static\u assert
来表示您实际关心的约束,例如std::is\u integral
或std::is\u same
等(默认类型参数Container
采用的数量实际上不是其中之一).既然您想要的东西可以接受多个与继承无关的类型,就把它做成一个模板吧
template <typename Container>
void doSomething(Container const& c)
{
for (auto v : c) {
// do something
}
}
模板
无效剂量测定(容器常数和c)
{
用于(自动v:c){
//做点什么
}
}
对于具有合适的begin()
和end()
方法(或begin(Container)
和end(Container)
重载)的任何类型的Container
都可以正常工作
如果您想接受迭代器(因为它更灵活,只允许对容器的某些子集进行操作)。。。改为在迭代器类型上对其进行模板化
请注意,如果您希望将容器约束为(例如)存储
int
,则不直接执行此操作要容易得多
直接的方法是将容器
设为模板参数,函数参数设为容器
。。。但是对于像std::vector
这样的容器来说,这并不能很好地工作,因为它有一个额外的分配器
类型参数(它是默认的,但仍然存在)
更好的方法是使用SFINAE或
static\u assert
来表示您实际关心的约束,例如std::is\u integral
或std::is\u same
等(默认类型参数Container
采用的数量实际上不是其中之一).为什么不直接制作doSomething
函数模板?为什么不直接制作doSomething
函数模板?谢谢!我还可以指定容器在模板中应该包含int
?通常不直接这样做更好(工作量更少,灵活性更高)。我在答案中编辑了一个简短的讨论。谢谢!我还可以指定容器在模板中应该包含int
?通常不直接这样做更好(工作量更少,灵活性更高)。我在答案中编辑了一个简短的讨论。