005
10.04.2006, 22:15 Uhr
Spacelord
Hoffnungsloser Fall
|
Hi, an dieser Stelle sei noch erwähnt dass deine ganzen Operator Klassen im Grunde schon Bestandteil des Standards sind. Da gibt es die von binary_function abgeleiteten Klassen plus,minus etc. die letztendlich das Gleiche machen. Das Problem ist nur,dass diese alle nen anderen Typ haben und du diese nicht so ohne weiteres als zweiten Wert deiner map Paare nehmen kannst. Abhilfe schafft da boost::function. function ist nen Wrapper für Funktionen,Funktoren etc. function schluckt alles was die angegebenen Argumente akzeptiert und den richtigen Rückgabewert hat. Damit kannst du dann mit bedeutend weniger Code ne generische Klasse anlegen mit der du z.B. auch mit komplexen Zahlen rechnen kannst.
C++: |
#include<iostream> #include<string> #include <map> #include <complex> #include "boost\\function.hpp"
using namespace std;
template <class T> class CalcKernel { typedef std::map<char,boost::function<T(T,T)> > dispatch_map; dispatch_map _map; public: T DispatchOperand(char op,T first_arg,T second_arg) { T result = T(); dispatch_map::iterator it = _map.find(op); if(it != _map.end()) result = (*it).second(first_arg,second_arg); else cout << "Operand not found" << endl; return result; } void AddOperand(const char op, boost::function<T(T,T)> _func) { _map.insert(std::make_pair(op, _func)); } };
template <class T> void init_basic_operators(CalcKernel<T> &k) { k.AddOperand('+',boost::function<T(T,T)>(std::plus<T>())); k.AddOperand('-',boost::function<T(T,T)>(std::minus<T>())); k.AddOperand('/',boost::function<T(T,T)>(std::divides<T>())); k.AddOperand('*',boost::function<T(T,T)>(std::multiplies<T>())); }
int main() { CalcKernel<double> kernel; init_basic_operators(kernel); cout<<"1.2 + 1.3 = "<<kernel.DispatchOperand('+',1.2,1.3)<<endl; cout<<"2.5 - 1.2 = "<<kernel.DispatchOperand('-',2.5,1.2)<<endl; cout<<"3.33 / 1.11 = "<<kernel.DispatchOperand('/',3.3,1.1)<<endl; cout<<"2.5 * 5.6 = "<<kernel.DispatchOperand('*',2.5,5.6)<<endl; //Und nen CalcKernel für komplexe Zahlen CalcKernel<std::complex<double> > complex_kernel; init_basic_operators(complex_kernel); complex<double> c1(1.3,2.4); complex<double> c2(3.4,2.1); cout<<"c1 + c2 = "<<complex_kernel.DispatchOperand('+',c1,c2)<<endl;
return 0; }
|
Gruss Spacelord -- .....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes. Dieser Post wurde am 10.04.2006 um 22:20 Uhr von Spacelord editiert. |