Considérons cette fonction, qui est censée multiplier chaque nombre dans une plage par une valeur fournie, et éventuellement prendre un foncteur pour obtenir une référence au nombre à multiplier:Foncteur C++ renvoyant une référence à son paramètre d'entrée
template <typename TIter, typename TNumber, typename TTransformer = self_reference<iterator_traits<TIter>::value_type>>
void multiply_range(TIter begin, TIter end, TNumber multiplicand, TTransformer transformer = TTransformer()) {
for_each(begin, end, [multiplicand, &transformer](typename iterator_traits<TIter>::value_type val){
transformer(val) *= multiplicand;
}
}
y at-il quelque chose dans la bibliothèque standard qui fait ce que self_reference
essaie de faire, à savoir un foncteur qui retourne une référence à son paramètre d'entrée?
(La bibliothèque standard a des choses comme std::less
et std::plus
, mais je ne suis pas demander quelque chose d'encore plus basique?)
Ainsi, le code suivant devrait fonctionner:
int x[4] = {1, 3, 5, 7};
multiply_range(x, x + 4, 2);
// x will become {2, 6, 10, 14}
vector<int> y[2] = {{1, 2}, {3, 4, 5}};
multiply_range(y, y + 2, 2, [](vector<int>& v) -> int& { return v[0]; });
// y will become {{2, 2}, {6, 4, 5}}
11 C++ et C++ 14 vont bien aussi.
Vous avez raison. Je vais changer le titre de la question. – Bernard
Je suis surpris qu'aucune partie de la bibliothèque de modèles '' ne nécessite l'utilisation d'un tel foncteur. –
Bernard