2017-01-05 2 views
6

Je suis à la recherche d'un foncteur unaire qui va déréférencer son argument et retourner le résultat. Bien sûr, je peux en écrire un, il semblait juste que quelque chose devrait déjà exister.Y a-t-il un Functor d'Indirection?

Donc, étant donné le code:

const auto vals = { 0, 1, 2, 3 }; 
vector<const int*> test(size(vals), nullptr); 

iota(begin(test), end(test), data(vals)); 

transform(cbegin(test), cend(test), ostream_iterator<int>(cout, " "), [](const auto& i){ return *i; }); 

Live Example

J'espérais qu'il y avait un foncteur que je pouvais utiliser au lieu du lambda. Est-ce qu'une telle chose existe, ou dois-je simplement utiliser le lambda?

+2

J'ai trouvé réponse très probable pourquoi la fonctionnalité n'a pas été ajouté à 'std' [ici] (http://forums.codeguru.com/showthread.php?495892-std- dereference-and-std-reference & p = 1933466 # post1933466) –

+0

@WF C'est intéressant, j'ai lu ce post avant de poser la question. L'exemple que j'ai donné est un MCVE, [mon cas d'utilisation réel pour cela] (http://stackoverflow.com/a/41486541/2642059) * est * un 'vecteur :: const_iterator>' :( –

Répondre

9

En supposant que par "foncteur"-vous dire "objet fonction" ou "objet appelable", there doesn't seem to be what you desire in the Standard Library.

Il est trivial de mettre en œuvre vous-même:


Notez que votre lambda ne fait pas ce que vous attendez, comme son type de retour est implicite -> auto, ce qui en fait une copie. Une lambda correcte possible est:

[](const auto& i) -> decltype(auto) { return *i; } 

Si vous ne spécifiez pas un explicite de fuite type de retour pour un lambda, celui implicite sera auto qui est toujours une copie. Cela n'a pas d'importance si operator* renvoie une référence, puisque le lambda renvoie une copie (c'est-à-dire que la référence renvoyée par operator* est ensuite copiée par l'instruction return de lambda).

struct A 
{ 
    A() = default; 
    A(const A&) { puts("copy ctor\n"); } 
}; 

int main() 
{ 
    []{ return *(new A); }(); // prints "copy ctor" 
} 

wandbox example

+3

Je voudrais utiliser 'decltype (auto)' de sorte qu'il fonctionne aussi pour InputIterators qui retournent des objets proxy –

+0

@JonathanWakely: bon point, mettre à jour le code pour le rendre plus général –

+0

@JonathanWakley Qu'est-ce qui me manque ici? opérateur] (http://fr.cppreference.com/w/cpp/language/operator_member_access#Built-in_indirection_operator) a retourné une référence à la valeur, pourquoi cela retournerait-il en valeur? –