La comparaison de std::fonctions de l'égalité?
Comment puis-je comparer les deux C++11 std::function
s avec operator==
, et retour true
si les deux dit function
s reportez-vous à la même pointeur de fonction?
- Alors qu'est-ce
std::function::target
faire? - Curieusement,
boost::function
permet de plus d'égalité vérifier questd::function
autant que je sache. - Semble être un doublon de: stackoverflow.com/questions/3629835/...
Vous devez vous connecter pour publier un commentaire.
l'opérateur== pour std::function compare un std::function avec un pointeur null, aussi loin que je peux dire que la norme ne fournit pas de détails quant à pourquoi.
Bien que, ce coup de pouce entrée de la FAQ, Pourquoi je ne peux pas comparer boost::function objets avec l'opérateur==, ou de l'opérateur!=? fournit une justification et d'aussi loin que je peux dire, devrait être applicable à std::function ainsi. Citant la FAQ:
il décrit ensuite demandé à des solutions similaires à Preet et continue à dire:
et explique pourquoi cela doit être traitée en soit l'opérateur d'affectation ou d'un constructeur et puis s'en va en disant:
mise à Jour
Trouvé une justification des normes en Accéder à la cible d'un tr1::la fonction de l'objet, ce qui est assez vieux, mais est cohérente avec le coup de pouce de la FAQ et dit:
Vous pouvez réellement obtenir de travailler avec
.target
:(Ref: C++ essayer d'obtenir la fonction de l'adresse d'un std::function)
size_t
est conditionnelle-pris en charge avec la mise en œuvre définies par la sémantique. Si cette solution peut ne pas être portable.std::function
Vous pouvez essayer de comparer
a
etb
d'abord en comparant leurs.target_type()
et si ces type de cible identifiants sont les mêmes, alors vous pouvez comparer leurs.cible()
pointeurs. Vous pouvez utiliser une désadaptation type de cible comme un faux.target<T>()
nécessite de connaître le type stockées, non, tout en sachant que c'est la même chose.Si le
std::function<T(U...)> f
est une fonction de membre de lafnPointer
sera nulle.Être conscient que l'égalité des fonctions de décider si les deux fonctions ont toujours le même comportement observable) est un problème indécidable dans le lambda calcul (et c'est pourquoi de nombreux langages de programmation interdire la comparaison de fonctions).
Donc, même si la
==
test compile, il serait plus juste de tester le code est identique (a la même adresse), non pas que la comparaison des fonctions ont le même comportement.