template <class Type,int dim>
struct TArr
{
Type X[dim];
Type& operator[]( const int i )
{
return X;
}
Type sum ()
{
Type zum=(Type)0;
for (int i=0;i<dim;i++)
zum+=X;
return zum;
};
//и т.д. ...
};
рекурсия и шаблоны
идею! Из базового класса наследуются векторы на 2,3,4
элемента. Основные методы хочу описать в базовом классе.
Но КАК??? Мне кажется тут рекурсия поможет.
Но как реалзовать??? В общем NEED HELP!!!
namespace vxn_vector
{
template <class Type,unsigned int dim,class argstr>
class vbase : public argstr
{
public:
inline Type& operator[]( const int i ) { return ((Type*)this); }
// ужасно коряво!!!!!!!
inline Type sum ()
{
Type zum=0;
for (int lp=0;lp<dim;lp++) zum+=((Type*)this)[lp];
return zum;
};
////
};
template <class Type>
struct for_4_arg
{
Type X, Y, Z, W;
};
template <class Type>
struct for_3_arg
{
Type X, Y, Z;
};
template <class Type>
struct for_2_arg
{
Type X, Y;
};
}
// 4 args
template <class Type>
class vector4 : public vxn_vector::vbase< Type,4, vxn_vector::for_4_arg<Type> >
{
typedef vxn_vector::vbase< Type,4, vxn_vector::for_4_arg<Type> > vbase;
public:
inline vector4()
{ X = 0; Y = 0; Z = 0; W = 0;};
inline vector4(Type x,Type y,Type z,Type w)
{ X = x; Y = y; Z = z; W = w;};
inline set(Type x,Type y,Type z,Type w)
{ X = x; Y = y; Z = z; W = w;};
inline reset()
{ X = Y = Z = W = 0;};
};
// 3 args
template <class Type>
class vector3 : public vxn_vector::vbase< Type,3, vxn_vector::for_3_arg<Type> >
{
typedef vxn_vector::vbase< Type,3, vxn_vector::for_3_arg<Type> > vbase;
public:
inline vector3()
{ X = 0; Y = 0; Z = 0; };
inline vector3(Type x,Type y,Type z)
{ X = x; Y = y; Z = z; };
inline set(Type x,Type y,Type z)
{ X = x; Y = y; Z = z; };
inline reset()
{ X = Y = Z = 0;};
};
// 2 args
template <class Type>
class vector2 : public vxn_vector::vbase< Type,2, vxn_vector::for_2_arg<Type> >
{
typedef vxn_vector::vbase< Type,2, vxn_vector::for_2_arg<Type> > vbase;
public:
inline vector2()
{ X = 0; Y = 0; };
inline vector2(Type x,Type y)
{ X = x; Y = y; };
inline set(Type x,Type y)
{ X = x; Y = y; };
inline reset()
{ X = Y = 0;};
};
Народ! Спасайте! Кто всётаки очхорошо шарится в темплатах??? SOS!!! А то повешусь и мировой терроризм придёт в упадок...
Цитата:
Originally posted by _anton
Народ! Спасайте! Кто всётаки очхорошо шарится в темплатах??? SOS!!! А то повешусь и мировой терроризм придёт в упадок...
Народ! Спасайте! Кто всётаки очхорошо шарится в темплатах??? SOS!!! А то повешусь и мировой терроризм придёт в упадок...
Андрей Александреску неплохо "шарится в темплатах"...
Непонятно, все-таки, в чем собс-но задача,
почему, например, не так:
Код:
с рекурсией, может быть, могло быть что-нить вроде:
Код:
template <class Type,unsigned dim>
struct TArrR
{
Type m_data;
TArrR<Type,dim-1> m_arr;
operator Type()
{
return (Type)m_data;
};
Type& operator[]( const int i )
{
if(i==0)
return m_data;
return m_arr.operator [](i-1);
};
Type sum ()
{
return m_data+=m_arr.sum();
}
};
/*Здесь должно было быть:
template<class T>
struct TArrR<T,0>
{
....
}
но у меня компилятор частичную спец-ю не
поддерживает...
*/
template <>
struct TArrR<int,0>
{
int m_data;
operator int()
{
return (int)m_data;
};
Type& operator[]( const int i )
{
return m_data;
};
Type sum ()
{
return m_data;
}
};
struct TArrR
{
Type m_data;
TArrR<Type,dim-1> m_arr;
operator Type()
{
return (Type)m_data;
};
Type& operator[]( const int i )
{
if(i==0)
return m_data;
return m_arr.operator [](i-1);
};
Type sum ()
{
return m_data+=m_arr.sum();
}
};
/*Здесь должно было быть:
template<class T>
struct TArrR<T,0>
{
....
}
но у меня компилятор частичную спец-ю не
поддерживает...
*/
template <>
struct TArrR<int,0>
{
int m_data;
operator int()
{
return (int)m_data;
};
Type& operator[]( const int i )
{
return m_data;
};
Type sum ()
{
return m_data;
}
};
???
Во, раскопал:
http://ru.livecode.org/index.php/%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8_%D0%BF%D0%BE_CPP
Спасибо отдельное за ссылку! Не знал...