Code:
//---------------------------------------------------------------------------
#ifndef si_unitH
#define si_unitH
#include<string>
#include<sstream>
using std::string;
using std::stringstream;
template<int meter,int kg,int sekunden,int ampere,int kelvin> class si_unit
{
public:
si_unit(double val): value(val){}
si_unit():value(0){}
double get()
{
return value;
}
void set(double val)
{
value = val;
}
private:
double value;
};
template<int meter1,int kg1,int sekunden1,int ampere1,int kelvin1,int meter2,int kg2,int sekunden2,int ampere2,int kelvin2>
si_unit<meter1+meter2,kg1+kg2,sekunden1+sekunden2,ampere1+ampere2,kelvin1+kelvin2> operator *(const si_unit<meter1,kg1,sekunden1,ampere1,kelvin1>& op1,const si_unit<meter2,kg2,sekunden2,ampere2,kelvin2>& op2)
{
return si_unit<meter1+meter2,kg1+kg2,sekunden1+sekunden2,ampere1+ampere2,kelvin1+kelvin2>(op1.get()*op2.get());
}
template<int meter1,int kg1,int sekunden1,int ampere1,int kelvin1,int meter2,int kg2,int sekunden2,int ampere2,int kelvin2>
si_unit<meter1-meter2,kg1-kg2,sekunden1-sekunden2,ampere1-ampere2,kelvin1-kelvin2> operator /(const si_unit<meter1,kg1,sekunden1,ampere1,kelvin1>& op1,const si_unit<meter2,kg2,sekunden2,ampere2,kelvin2>& op2)
{
return si_unit<meter1-meter2,kg1-kg2,sekunden1-sekunden2,ampere1-ampere2,kelvin1-kelvin2>(op1.get()/op2.get());
}
template<int meter,int kg,int sekunden,int ampere,int kelvin>
si_unit<meter,kg,sekunden,ampere,kelvin> operator +(const si_unit<meter,kg,sekunden,ampere,kelvin>& op1,const si_unit<meter,kg,sekunden,ampere,kelvin>& op2)
{
return si_unit<meter,kg,sekunden,ampere,kelvin>(op1.get()+op2.get());
}
template<int meter,int kg,int sekunden,int ampere,int kelvin>
si_unit<meter,kg,sekunden,ampere,kelvin> operator *(const si_unit<meter,kg,sekunden,ampere,kelvin>& op1,double op2)
{
return si_unit<meter,kg,sekunden,ampere,kelvin>(op1.get()*op2);
}
template<int meter,int kg,int sekunden,int ampere,int kelvin>
si_unit<meter,kg,sekunden,ampere,kelvin> operator /(const si_unit<meter,kg,sekunden,ampere,kelvin>& op1,double op2)
{
return si_unit<meter,kg,sekunden,ampere,kelvin>(op1.get()/op2);
}
template<int meter,int kg,int sekunden,int ampere,int kelvin>
si_unit<meter,kg,sekunden,ampere,kelvin> operator -(const si_unit<meter,kg,sekunden,ampere,kelvin>& op1,const si_unit<meter,kg,sekunden,ampere,kelvin>& op2)
{
return si_unit<meter,kg,sekunden,ampere,kelvin>(op1.get()-op2.get());
}
template<int meter,int kg,int sekunden,int ampere,int kelvin> string get_name(si_unit<meter,kg,sekunden,ampere,kelvin> const&)
{
stringstream erg;
if(meter != 0)
{
erg<<"m^"<<meter<<" ";
}
if(kg != 0)
{
erg<<"kg^"<<kg<<" ";
}
if(sekunden != 0)
{
erg<<"s^"<<sekunden<<" ";
}
if(ampere != 0)
{
erg<<"C^"<<ampere<<" ";
}
if(kelvin != 0)
{
erg<<"K^"<<kelvin<" ";
}
return erg.str();
}
#define SI_TYPEDEF(m, kg, s, c,k, name, name2) \
typedef si_unit<m, kg, s, c,k> name; \
std::string get_name(name const&){return name2;}
SI_TYPEDEF(1,0,0,0,0,Laenge," m")
SI_TYPEDEF(0,1,0,0,0,Masse," kg")
SI_TYPEDEF(0,0,1,0,0,Zeit," s")
SI_TYPEDEF(0,0,0,1,0,Strom," A")
SI_TYPEDEF(0,0,0,0,1,Temperatur," K")
SI_TYPEDEF(2,0,0,0,0,Flaeche," m^2")
SI_TYPEDEF(3,0,0,0,0,Raum," m^3")
SI_TYPEDEF(1,0,-1,0,0,Geschwindigkeit," m/s")
SI_TYPEDEF(1,0,-2,0,0,Beschleunigung," m/s^2")
SI_TYPEDEF(1,1,-2,0,0,Kraft," N")
SI_TYPEDEF(2,1,-2,0,0,Energie," J")
SI_TYPEDEF(2,1,-3,0,0,Leistung," W")
SI_TYPEDEF(0,0,-1,0,0,Frequenz," Hz")
SI_TYPEDEF(-1,1,-2,0,0,Druck," Pa")
SI_TYPEDEF(2,1,-3,-1,0,Spannung," V")
SI_TYPEDEF(0,0,1,1,0,Ladung," C")
SI_TYPEDEF(2,1,-2,-1,0,mag_Fluss," Wb")
SI_TYPEDEF(2,1,-3,-2,0,Widerstand," Ohm")
SI_TYPEDEF(-2,-1,3,2,0,Leitwert," S")
SI_TYPEDEF(2,1,-2,-2,0,Induktivitaet," H")
SI_TYPEDEF(-2,-1,4,2,0,Kapazitaet," F")
SI_TYPEDEF(0,1,-2,-1,0,Induktion," T")
//---------------------------------------------------------------------------
#endif
durch das einbinden des Headers ist sowas möglich