remplacer la carte::comparer avec fonction lambda directement
Essayer de passer outre map::compare
fonction à l'aide de lambda, il semble que la solution suivante œuvres.
auto cmp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(cmp)> myMap(cmp);
Mais, j'ai dû définir cmp
premier et l'utiliser plus tard.
Puis-je le faire sans que la définition de 'cmp'?
cmp
n'est pas un pointeur de fonction.- Faire quoi?
int
s déjà de les comparer les uns aux autres. Qu'essayez-vous de faire? Et pourquoi ne veux-tu pas utiliser une fonction? - Ouais, pointeur de fonction n'était pas un terme précis. Modifié la question de rendre la question plus claire.
- Alors, quelle approche avez-vous utilisé qui a échoué? Nous savons que vous voulez quelque chose autre que votre exemple, mais pas ce que votre objectif ultime est.
- Mais ne peut pas captureless lambas être converti en un pointeur de fonction?
Vous devez vous connecter pour publier un commentaire.
Non, vous ne peut pas utilisation lambda non évaluées dans le contexte: c'est à dire les paramètres de modèle comme dans votre exemple.
Si vous doit définir quelque part d'autre (à l'aide de
auto
) et ensuite utiliserdecltype
... dans l'autre sens, comme il a été déjà mentionné, est d'utiliser un "ordinal" foncteursSi votre question est à propos de "comment utiliser l'expression lambda *une fois* lorsque vous définissez une carte", vous pouvez exploiter la conversion implicite de lambdas à
std::function
comme ceci:vous pouvez introduire un alias pour que
map
type à réduire la frappe plus tard...std::function
ajouterait un niveau d'indirection et de le rendre moins efficace.À l'aide de
std::function
à donner le type de signature pour le comparateur type vous pouvez définir votre type de carte, puis assigner n'importe quel lambda comparez vous le souhaitez.std::function
se sent comme une mauvaise solution. Un alias de modèle, à la place?template<typename Comp> using MyMap = std::map<int, int, Comp>;
et puis vous n'avez pas à définir le comparateur jusqu'à ce que vous instanciez la carte.Comp
paramètre de toute façon (au point d'instanciation).Que vous pourriez faire quelque chose comme ça où le type de la carte est déduit de la fonction de vous transmettre à une fonction.
Je ne vois pas une tonne de raisons pour cela, mais je ne vais pas dire que c'est inutile. En général, vous voulez un connu comparateur de sorte que la carte peut être transmis facilement. Avec la configuration ci-dessus vous sont réduits à l'aide de modèle de fonctions tout le temps comme suit
Ce n'est pas nécessairement mauvais, mais mon instinct me dire que le fait d'avoir un type qui ne peuvent être traitées par des fonctions génériques est mauvais. Je pense qu'il fonctionne bien pour les lambda fonctions, mais c'est tout. La solution ici est d'utiliser std::function
Maintenant vous pouvez utiliser n'importe quel prédicat que vous voulez et vous avez un type de béton à travailler avec, my_map
espérons que cette aide!