2010-04-27 138 views

回答

8

ERR .. std::vector<t>std::basic_string<t>std::map<k, v>std::deque<t>

我用这个代表一个注册表项的类,其中operator[]返回一个表示注册表值的对象,其中包含[] s之间的字符串。

另请参阅Spirit Parser Framework,它使用[]进行语义操作。

3

如果你实现几乎任何类型的容器,为其元素提供随机访问(或者至少某种形式的键控访问)(例如,考虑std::vector),这很有用。

1

如果您编写的继承自实现[]运算符的其他类的类,则可能需要覆盖[]运算符,如std::vectorstd::string。如果你不这样做,你的类可能不会像用户所期望的那样工作,因为你的类将隐含地继承父类的[]的实现。

1

好吧,几个STL容器给出了一些例子 - vector<>重载它使它像一个数组一样。例如,map<>提供了operator[]重载以提供“关联数组”。

1

虽然它不是严格必要的,但它对于使用户定义的容器或字符串的行为类似于内置数组或C字符串非常有用。这很大程度上减少了冗长(例如,在Java中,您将不得不使用x.getElementAt(i),而在C++中您可以使用x [i];同样,在Java中,您需要x.compareTo(y)< 0 ,而在C++中,您可以使用x < y)来实现相同的功能。它是句法糖......但它非常非常好吃。

4

不限可转位容器可以有效地限定operator[]成为在使用[] -syntax索引任何模板可用。

你不需要是语法糖,如果你不这样做泛型编程 - 它可能看起来不错,但是,化妆品之余,你总是可以定义特定的命名方法,如getAtsetAt和类似的,具有类似和更简单的代码功能。然而,泛型编程是现代C++的核心......它与“编译时,类型安全的鸭子打字”有着惊人的相似性(当然,我偏向于这种特殊的术语,有一部分在塑造它 - cfr wikipedia ;-)。

正如你应该尝试使用的,例如,前缀*意味着对所有类型的迭代器和其他指针类型的“解引用”(因此它们可以用鸭子型代替指针在模板中!),所以类似地,你应该努力在容器类型中定义operator[],这样它们才有意义,这样才能在适当的模板中用鸭子型代替数组。