2016-08-27 1 views
3

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.

Répondre

4

un foncteur qui retourne une référence à son paramètre d'entrée

est tout à fait différent d'un

C++ Functor qui retourne les

Qu'est-ce que vous cherchez est la plus connue sous le nom de transformée "identity" (er, ou functor), et ne fait pas partie de la bibliothèque standard C++.

+0

Vous avez raison. Je vais changer le titre de la question. – Bernard

+0

Je suis surpris qu'aucune partie de la bibliothèque de modèles '' ne nécessite l'utilisation d'un tel foncteur. – Bernard