// ---------------------
// MethodOverloading.c++
// ---------------------
#include <cassert> // assert
#include <cstddef> // size_t
#include <iostream> // cout, endl
template <typename T>
class my_vector {
private:
std::size_t _s;
T* _a;
public:
my_vector (std::size_t s, const T& v = T()) :
_s (s),
_a (new T[_s]) {
std::fill(begin(), end(), v);}
~my_vector () {
delete [] _a;}
T& at (std::size_t i) {
my_vector<T>* const p = this;
assert(p == this);
return _a[i];}
const T& at (std::size_t i) const {
const my_vector<T>* const p = this;
assert(p == this);
return const_cast<my_vector<T>*>(this)->at(i);}
T* begin () {
return _a;}
const T* begin () const {
return _a;}
T* end () {
return _a + _s;}
const T* end () const {
return _a + _s;}};
int main () {
using namespace std;
cout << "MethodOverloading.c++" << endl;
{
const my_vector<int> x(10, 2);
assert(x.at(1) == 2);
// x.at(1) = 3; // doesn't compile
}
{
my_vector<int> x(10, 2);
assert(x.at(1) == 2);
x.at(1) = 3;
assert(x.at(1) == 3);
}
cout << "Done." << endl;
return 0;}
syntax highlighted by Code2HTML, v. 0.9.1