#include <vector>
#include <iostream>
#include <stdexcept>
#include <limits>
using namespace std;
// ----------------------------------------------------------------------------
struct Entry {
string name;
int number;
};
// ----------------------------------------------------------------------------
template<typename T>
class Vec : public std::vector<T> {
public:
// TO DO : I d not understand the next statement
// See http://w...content-available-to-author-only...p.com/what-is-2009.pdf
// This means "import" vector() (constructors) from std::vector
// Inheriting constructors
using vector<T>::vector; // use the constructors from vector (under the name Vec). There is a typo in the book
T& operator[](int i) // range check
{
return vector<T>::at(i);
}
const T& operator[](int i) const // range check const objects; ยง4.2.1
{
return vector<T>::at(i);
}
};
// ----------------------------------------------------------------------------
void checked(Vec<Entry>& book)
{
try {
book[book.size()] = { "Joe", 999999 }; // will throw an exception
// ...
}
catch (out_of_range) {
cout << "range error\n";
}
}
// ----------------------------------------------------------------------------
void Test(void) {
Vec<Entry> MyBook;
checked(MyBook);
}
// ----------------------------------------------------------------------------
int main() {
Test();
cout << "Press ENTER to quit : ";
cin.ignore((numeric_limits<streamsize>::max)(), '\n');
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPiAKI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPGxpbWl0cz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0cnVjdCBFbnRyeSB7CiAgc3RyaW5nIG5hbWU7CiAgaW50IG51bWJlcjsKfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgVmVjIDogcHVibGljIHN0ZDo6dmVjdG9yPFQ+IHsKCnB1YmxpYzoKICAvLyBUTyBETyA6IEkgZCBub3QgdW5kZXJzdGFuZCB0aGUgbmV4dCBzdGF0ZW1lbnQKICAvLyBTZWUgaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnAuY29tL3doYXQtaXMtMjAwOS5wZGYKICAvLyBUaGlzIG1lYW5zICJpbXBvcnQiIHZlY3RvcigpIChjb25zdHJ1Y3RvcnMpIGZyb20gc3RkOjp2ZWN0b3IKICAvLyBJbmhlcml0aW5nIGNvbnN0cnVjdG9ycwogIHVzaW5nIHZlY3RvcjxUPjo6dmVjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY29uc3RydWN0b3JzIGZyb20gdmVjdG9yICh1bmRlciB0aGUgbmFtZSBWZWMpLiBUaGVyZSBpcyBhIHR5cG8gaW4gdGhlIGJvb2sKICBUJiBvcGVyYXRvcltdKGludCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYW5nZSBjaGVjawogIHsKICAgIHJldHVybiB2ZWN0b3I8VD46OmF0KGkpOwogIH0KCiAgY29uc3QgVCYgb3BlcmF0b3JbXShpbnQgaSkgY29uc3QgLy8gcmFuZ2UgY2hlY2sgY29uc3Qgb2JqZWN0czsg4Lii4LiHNC4yLjEKICB7CiAgICByZXR1cm4gdmVjdG9yPFQ+OjphdChpKTsKICB9Cn07CgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIGNoZWNrZWQoVmVjPEVudHJ5PiYgYm9vaykKewogIHRyeSB7CiAgICBib29rW2Jvb2suc2l6ZSgpXSA9IHsgIkpvZSIsIDk5OTk5OSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24KICAgIC8vIC4uLgogIH0KICBjYXRjaCAob3V0X29mX3JhbmdlKSB7CiAgICBjb3V0IDw8ICJyYW5nZSBlcnJvclxuIjsKICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBUZXN0KHZvaWQpIHsKCiAgVmVjPEVudHJ5PiBNeUJvb2s7CiAgY2hlY2tlZChNeUJvb2spOwoKCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IG1haW4oKSB7CgoKICAgIFRlc3QoKTsKCiAgICBjb3V0IDw8ICJQcmVzcyBFTlRFUiB0byBxdWl0IDogIjsKICAgIGNpbi5pZ25vcmUoKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgpKCksICdcbicpOwp9