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
?通常不直接这样做更好(工作量更少,灵活性更高)。我在答案中编辑了一个简短的讨论。