Listing 1

template<typename Res, typename T1, typename T2>
class addition
{
   private:
      typedef typename addition_traits<T1>::type type1;
      typedef typename addition_traits<T2>::type type2;
      type1 first_;
      type2 second_;
   public:
      typedef Res value_type;
      addition(type1 first, type2 second)
         : first_(first), second_(second) { }
      type1 first(void) const { return first_; }
      type2 second(void) const { return second_; }
};