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_; }
};