#include <iostream>
template <typename T>
struct trais
{
typedef T value_type;
};
template<typename T>
struct trais<T*>
{
typedef typename trais<T>::value_type value_type;
};
template<typename T>
struct trais<T&>
{
typedef typename trais<T>::value_type value_type;
};
template<typename T>
struct add_ref
{
typedef typename trais<T>::value_type& value_type;
};
template<typename T>
struct add_const_base
{
typedef const typename trais<T>::value_type value_type;
};
template<typename T>
struct add_const
{
typedef const T value_type;
};
template<int N>
struct int_
{
static const int value = N;
typedef int value_type;
};
template <typename T,int i,int j,int k>
struct vector
{
typedef T value_type;
typedef int_<i> value_1;
typedef int_<j> value_2;
typedef int_<k> value_3;
static const int size = 3;
};
template <typename T>
class value
{
public:
typedef T value_type;
value(double _value = 0.0): m_value(_value)
{
}
double getValue() const
{
return m_value;
}
private:
double m_value;
};
template <typename T>
T operatorAdd(const T &v1,const T &v2)
{
return T(v1.getValue()+v2.getValue());
}
int main()
{
add_const_base<int*>::value_type i = 1;
std::cout << int_<5>::value;
typedef vector<int,1,0,0> min;//米
typedef vector<int,2,0,0> min2;//米^2
typedef vector<int,1,-2,0> add;//m/s^2
typedef vector<int,1,1,0> speed;//m/s
typedef value<min> Min;
typedef value<min2> Min2;
int k = 3;
add_ref<int>::value_type j = k;
std::cout << j << std::endl;
Min a(2.12);
Min b(2.34);
Min2 c;
a = b;
//c = a;
std::cout << operatorAdd(a,b).getValue();
//std::cout << operatorAdd(b,c).getValue();
return 0;
}
模板元编程练习
最新推荐文章于 2019-01-17 00:08:46 发布