我有一组不同类型的容器,每个容器都与一个字符串id相关联。如果关联的容器不为空,则以下函数应打印id。
如果我想将std :: vector的大小传递给函数,我应该将它作为size_type对象传递吗?像这样:
void printIfNotEmpty(const std::string& id, size_type sizeOfContainer)
{
if(sizeOfContainer)
{
output << id << " is not empty";
}
else
{
output << id << " is empty";
}
}
如果是这样,size_type的命名空间是什么?如何在代码中包含其定义?
也许这是一个解决方案:
template<class T>
void printIfNotEmpty(const std::string& id, const T& container)
{
if(container.size())
{
output << id << " is not empty";
}
else
{
output << id << " is empty";
}
}
答案 0 :(得分:6)
我应该将它作为size_type对象传递吗?
这是最便携的事情。 (顺便说一下,它不是一个类对象的“对象”;它是一个无符号整数类型,大到足以表示任何向量的大小)。
如果您知道它是带有标准分配器的向量,并且将来不太可能发生变化,那么使用std::size_t
可能不那么冗长。
(当然,在这个简单的例子中,传递一个布尔标志,或者删除条件并使调用者负责决定是否调用该函数更有意义;但我假设它是打算表示更复杂的情况,其中传递大小是有意义的。)
如果是这样,在什么命名空间中是size_type?
每个标准容器(以及为满足标准容器要求而设计的任何其他容器)将其定义为嵌套类型。
如何在代码中包含其定义?
定义在<vector>
;您必须将其限定为std::vector<whatever>::size_type
。
std::size_t
在<cstddef>
中定义。
答案 1 :(得分:2)
size_type
位于std
,顺便说一下,它不是一个对象。是的,你应该用它来实现便携性。例如,在Win64中,如果您使用int
,则会收到转化警告,因为size_type
大于该平台上的int
。
但在深入研究之前,请参阅'size_t' vs 'container::size_type'。
答案 2 :(得分:2)
据我所知,大小不是字符串的大小,所以如果你只需要做你的代码,你就可以这样做:
void printIfNotEmpty(const std::string& name, bool empty) {
if(!empty) {
output << name;
}
}
并称之为:
printIfNotEmpty(a_string, a_vector.empty());
但是对于处理大小,我通常使用泛型size_t
类型,这是一种无符号整数类型,其大小取决于平台。隐式类型转换在这里很好,因此您不必使用std::vector<T>::size_type
之类的声明来重载代码,这些声明通常只是size_t的typedef。
答案 3 :(得分:1)
这是一个奇怪的界面,因为
printIfNotEmpty("Baz", 37);
没有多大意义。
如果您真的对不同容器的状态感兴趣,请将其作为参数传递 如果要处理不同类型的容器,请使用模板。
template<typename T>
void printIfNotEmpty(const std::string& name, const std::vector<T>& collection)
{
if (!collection.empty())
// ...
}
甚至更一般
template<typename Collection>
void printIfNotEmpty(const std::string& name, const Collection& collection)
{
if (!collection.empty())
// ...
}
答案 4 :(得分:-1)
不需要传递std::vector<T>::size_type
,其中T
是您对象的类型。
对于第二个问题,size_type
是typedef
(变量类型的“别名”),它在向量容器类中是命名空间。