Qui ho funtore del tipo seguente:Come ridurre gli argomenti del modello?
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()`
}
};
e il campione struct:
struct FF
{
int m;
int r;
};
voglio usare il funtore X, ma io non voglio specificare esplicitamente argomento di template come segue :
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?
}
Ecco quello che ho provato senza successo:
// 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>();
}
Piccola correzione (il codice "corretto" non viene compilato): la dichiarazione del tipo restituito di 'createx' dovrebbe contenere' p' come terzo parametro del modello, non 'T Foo :: * p'. Non cambia il problema, comunque. –