Ici, j'ai foncteur du genre de suivi:Comment réduire les arguments de modèle?
template<class T, class Foo, T Foo::*p>
struct X {
void operator()(Foo & f) {
(f.*p) = 12 * (f.*p); // simple example. could be more complex `operator()`
}
};
Et struct exemple:
struct FF
{
int m;
int r;
};
Je veux utiliser le foncteur X, mais je ne veux pas spécifier explicitement l'argument de modèle comme suit :
void testforx()
{
std::vector<FF> cont(5);
std::for_each(cont.begin(), cont.end(), X<int, FF, &FF::r>()); // it work, but I don't want to write `int` and `FF`
std::for_each(cont.begin(), cont.end(), createx<&FF::r>()); // how I would like to use it, how to declare `createx` function?
}
Voici ce que j'ai essayé sans succès:
// that is what I tried, but it could not deduce T and Foo
template<T Foo::*p, class T, class Foo>
X<T, Foo, T Foo::*p> createx()
{
return X<T, Foo, p>();
}
// this works, but requires to write T and Foo explicitly
template<class T, class Foo, T Foo::*p>
X<T, Foo, T Foo::*p> createx()
{
return X<T, Foo, p>();
}
Petit correctif (votre code "correct" ne compile pas): votre déclaration de type de retour de 'createx' devrait contenir' p' comme troisième paramètre de modèle, pas 'T Foo :: * p'. Ne change pas le problème, cependant. –