[ create a new paste ] login | about

Link: http://codepad.org/dLb34JI8    [ raw code | output | fork ]

C++, pasted on Jul 17:
#include <iostream>
#include <typeinfo>
#include <boost/typeof/typeof.hpp> // BOOST_TYPEOF

// promote traits
template <typename T, typename U>
struct promote_trait {
	typedef BOOST_TYPEOF(T()+U()) promote_type;
};

template <typename T,typename U>
void test()
{
	std::cout 
		<< "(" << typeid(T).name() 
		<< "," << typeid(U).name() 
		<< ") -> " << typeid(typename promote_trait<T,U>::promote_type).name() << std::endl;
}

// class MyVec
template <typename T>
class MyVec
{
public:
	typedef T value_type;
	
	static const size_t N = 3;
	value_type data[N];
	
	void output() const
	{
		for( size_t i = 0; i < N; ++i ) {
			std::cout << data[i] << " ";
		}
		std::cout << std::endl;
	}
	
	MyVec( T v0, T v1, T v2 )
	{
		data[0] = v0;
		data[1] = v1;
		data[2] = v2;
	}
	
	MyVec()
	{
		for( size_t i = 0; i < N; ++i )
			data[i] = 0;
	}
	
	MyVec( const MyVec& s )
	{
		for( size_t i = 0; i < N; ++i )
			data[i] = s.data[i];
	}
	
	template <typename U>
	MyVec( const MyVec<U>& s )
	{
		for( size_t i = 0; i < N; ++i )
			data[i] = s.data[i];
	}
	
	template <typename U>
	MyVec& operator=( const MyVec<U>& s )
	{
		for( size_t i = 0; i < N; ++i )
			data[i] = s.data[i];
	}
	
	template <typename U>
	MyVec<typename promote_trait<T,U>::promote_type> operator+( const MyVec<U>& rhs )
	{
		typedef typename promote_trait<T,U>::promote_type pr_type;
		MyVec<pr_type> t;
		for( size_t i = 0; i < N; ++i )
			t.data[i] = static_cast<pr_type>( data[i] + rhs.data[i] );
		return t;
	}
};

int main()
{
	test <int,float> ();
	test <int,double> ();
	test <int,long double> ();
	
	test <float,float> ();
	test <float,double> ();
	test <float,long double> ();
	
	test <double,float> ();
	test <double,double> ();
	test <double,long double> ();
	
	test <long double,float> ();
	test <long double,double> ();
	test <long double,long double> ();
	
	MyVec<double> x, y(1,2,3);
	MyVec<float> z(-1,1,0);
	MyVec<long double> a = x + z + y; // (0,3,3)
	a.output();
	
	std::cout << "x+z+y -> " << typeid(BOOST_TYPEOF(x+z+y)).name() << std::endl;
	
	return 0;
}


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(i,f) -> f
(i,d) -> d
(i,e) -> e
(f,f) -> f
(f,d) -> d
(f,e) -> e
(d,f) -> d
(d,d) -> d
(d,e) -> e
(e,f) -> e
(e,d) -> e
(e,e) -> e
0 3 3 
x+z+y -> 5MyVecIdE


Create a new paste based on this one


Comments: