CS 330 Lecture 24 – Templates
Agenda
- what ?s
 - program this
 - a templated vector class
 - overloading builtin operators
 
TODO
- Read section 7.7.3 in your book.
 - Wondering about Java’s garbage collection? Read http://www.ibm.com/developerworks/library/j-jtp10283/.
 - Why do we need both delete and delete[]? Check out http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=287.
 - 1/4 sheet.
 
Program This
A vector is a quantity in n-dimensions. 2-D vectors can represent points in 2-D space or offsets in 2-D space. 3-D vectors do the same in 3-D. And so on. Consider an operation/method that one might perform on a vector. Write pseudocode to perform the operation.
Code
QVector.h
#ifndef QVECTOR_H
#define QVECTOR_H
#include <cassert>
#include <cmath>
#include <iostream>
using std::ostream;
template <typename T, int ndims>
class QVector {
  public:
    /* QVector() { */
    /* } */
    QVector(T fill = 0) {
      for (int i = 0; i < ndims; ++i) {
        coords[i] = fill;
      }
    }
    T operator[](int i) const {
      assert(i >= 0 && i < ndims);
      return coords[i];
    }
    T& operator[](int i) {
      assert(i >= 0 && i < ndims);
      return coords[i];
    }
    QVector<T, ndims> operator+(const QVector<T, ndims>& other) {
      QVector<T, ndims> sum;
      for (int i = 0; i < ndims; ++i) {
        sum[i] = coords[i] + other[i];
      }
      return sum;
    }
    T GetMagnitude() const {
      T sum = 0;
      for (int i = 0; i < ndims; ++i) {
        sum += coords[i] * coords[i];
      }
      return sqrt(sum);
    }
  private:
    T coords[ndims];
};
template <typename T, int ndims>
ostream& operator<<(ostream& out, const QVector<T, ndims>& v) {
  for (int i = 0; i < ndims; ++i) {
    out << v[i] << " ";
  }
  out << std::endl;
  return out;
}
#endif
vector_test.cpp
#include <iostream>
#include "QVector.h"
int main(int argc, char **argv) {
  QVector<int, 4> v1;
  std::cout << "v1: " << v1 << std::endl;
  std::cout << "v1[0]: " << v1[0] << std::endl;
  std::cout << "v1[1]: " << v1[1] << std::endl;
  std::cout << "v1[2]: " << v1[2] << std::endl;
  std::cout << "v1[3]: " << v1[3] << std::endl;
  v1[0] = 7;
  std::cout << "v1[0]: " << v1[0] << std::endl;
  std::cout << "v1[1]: " << v1[1] << std::endl;
  std::cout << "v1[2]: " << v1[2] << std::endl;
  std::cout << "v1[3]: " << v1[3] << std::endl;
  std::cout << "v1: " << v1 << std::endl;
  v1 = v1 + v1;
  std::cout << "v1: " << v1 << std::endl;
  std::cout << "v1.GetMagnitude(): " << v1.GetMagnitude() << std::endl;
  /* QVector<double, 3> v2; */
  /* QVector<bool, 2> v3; */
  return 0;
}
Haiku
It started with New York
Now you can ♥ anything
‘Cuz they are <T>-shirts
  Now you can ♥ anything
‘Cuz they are <T>-shirts