accumlate avec une fonction membre 2
Bonjour j'essai d'utiliser accumulate pour faire un somme en utilisant une fonction membre comme foncteur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
class Vehicule
{
public:
virtual int GetNbRoues() =0;
template <class T>
T addtest(T &a) {return a+=GetNbRoues();};
};
class voiture : public Vehicule
{
public:
virtual int GetNbRoues() {return 4;};
};
class moto : public Vehicule
{
public:
virtual int GetNbRoues() {return 2;};
};
template<class T1, class T2>
T1 & addNay2 (T1 &a,T2 &b){return a+=b->GetNbRoues();};
int main(int argc, char* argv[])
{
std::vector<Vehicule*> vect;
vect.push_back( new voiture);
vect.push_back(new voiture);
vect.push_back(new moto);
vect.push_back(new moto);
vect.push_back(new voiture);
vect.push_back(new moto);
vect.push_back(new moto);
vect.push_back(new voiture);
int nb =std::accumulate(vect.begin(),vect.end(),0.f, std::mem_fun(&Vehicule::addtest<int>));
return 0;
} |
mais accumulate n'envoye pas les paramètres dans le bon sens,
TY =func(Ty,pToto) au lieu de TY =func(pToto,Ty).
existe t'il un fonction qui inverse les parametres?
j'ai essayer de definir un mem_fun avec les parametre inversé
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| template<class _Result,
class _Ty,
class _Arg>
class mem_fun1_tr
: public std::binary_function<_Arg,_Ty *, _Result>
{ // functor adapter (*p->*pfunc)(val), non-const *pfunc
public:
explicit mem_fun1_tr(_Result (_Ty::*_Pm)(_Arg))
: _Pmemfun(_Pm)
{ // construct from pointer
}
_Result operator()(_Arg _Right,_Ty *_Pleft) const
{ // call function with operand
return ((_Pleft->*_Pmemfun)(_Right));
}
private:
_Result (_Ty::*_Pmemfun)(_Arg); // the member function pointer
};
template<class _Result,
class _Ty,
class _Arg> inline
mem_fun1_tr<_Result, _Ty, _Arg> mem_funr(_Result (_Ty::*_Pm)(_Arg))
{ // return a mem_fun1_t functor adapter
return (mem_fun1_tr<_Result, _Ty, _Arg>(_Pm));
} |
ca marche mais je ne trouve pas ca propre