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:
|
(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
|
|