一本书讨论string::size_type
(这是string.size()
类的std::string
函数的返回类型。)
我不明白这些"伴侣类型是什么"。有人能给我一个详细的解释吗?我们怎样才能访问它们?我们怎样才能在课堂上创造它们?我听说他们是某种类型的别名,怎么样?我无法在网上找到任何这些信息。
答案 0 :(得分:3)
std::string
类型 - 以及其他序列容器 - 具有一堆关联类型。例如,有string::iterator
,这种类型可以迭代字符串中的字符。
类型string::size_type
是某种能够保持字符串大小的类型。您可以通过写下这样的内容来使用它:
string::size_type size = myString.size(); // Or something else
在常规编程实践中看到人们实际使用此类型并不常见。大多数人只在这里使用size_t
或auto
。
string::size_type
类型的原因在于,对序列容器起作用的模板函数可以接受模板参数,然后从中提取有用信息,如下所示:
template <typename Sequence> void doSomething(const Sequence& seq) {
typename Sequence::size_type size = seq.size();
...
}
你可能不会很快就会做那样的事情,所以请随意使用size_t
或类似的东西。
答案 1 :(得分:1)
Companion types
可能只是提及member types
的比喻方式,即在另一种类型中声明的类型
例如,string包含一大堆size_type
你是对的,它们是用typedef
或using
创建的类型别名(自c ++ 11起)
例如,foo
有两种companion
类型,但由于可见性,用户只能访问一种
class foo
{
public:
using bar = int;
private:
struct internal { /* impl */};
...
typedef internal baz;
}
任何人现在都可以实例化foo::bar
类型的变量,并且还允许foo
(或std::string
)的作者稍后更改成员类型,而无需您重写代码,只要您使用它们一贯