Cela peut être une question naïve, mais ici, il va de toute façon:L'utilisation correcte d'un foncteur dans std :: for_each et std :: transformer
Supposons que j'ai une classe comme ceci:
class func {
public:
int operator()(int it) const { return it + 21; }
};
Comme son clair, un foncteur est défini dans la classe ci-dessus, et si je fais ceci:
func obj;
int capture = obj(9);
cout << capture << endl;
le résultat sera 30, comme une évidence. Mais supposons que j'utilise std::transform
pour transformer un conteneur en utilisant les valeurs d'un autre conteneur selon le foncteur ci-dessus défini.
vector<int> v, vi;
v.push_back(1);
v.push_back(2);
vi.resize(v.size());
Je suivre la syntaxe ci-dessous, où j'invoquer le foncteur directement en utilisant le nom de la classe, et aussi, aucun argument est passé à foncteur (dont il a besoin en fonction de la définition):
std::transform(v.begin(), v.end(), vi.begin(), func());
Cela fonctionne parfaitement. Pourquoi cela arrive-t-il ? Malgré ne pas utiliser une instance du func
et aussi, sans passer un argument (qui est l'élément du premier conteneur apparemment), pourquoi cela fonctionne?
De plus, si j'utilise une instance de func
, avec un argument comme je l'ai fait ci-dessus, cela provoque une erreur de compilation.
func instance;
std::transform(v.begin(), v.end(), vi.begin(), instance());
Comment utiliser un foncteur correctement dans std::transform/std::for_each
? Pourquoi y a-t-il une différence dans la façon dont la méthode functor est invoquée?
En outre, à partir this answer on functors, nous avons le morceau de code suivant:
// this is a functor
struct add_x {
add_x(int x) : x(x) {}
int operator()(int y) const { return x + y; }
private:
int x;
};
std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1));
La réponse précise que add_x(1)
agit un foncteur ici (et non une instance), comment est-il un exemple dans l'exemple ci-dessus, je a donné?
Ceci est un exemple: 'lambda_function()'. – juanchopanza
Si c'est une instance, comment fonctionne-t-elle en tant que foncteur, sans argument? Ne devrait-il pas lancer une erreur de compilation? – Jarvis
Pourquoi appelez-vous les choses "lambda_function" et "capture" lorsque votre code n'a rien à voir avec les fonctions lambda et les captures? –