Sans passer trop de temps à passer en revue le code source du boost, quelqu'un pourrait-il me donner un rapide aperçu de la façon dont boost bind est implémenté?Comment le boost fonctionne-t-il dans les coulisses en général?
Répondre
J'aime ce morceau de la source bind
:
template<class R, class F, class L> class bind_t
{
public:
typedef bind_t this_type;
bind_t(F f, L const & l): f_(f), l_(l) {}
#define BOOST_BIND_RETURN return
#include <boost/bind/bind_template.hpp>
#undef BOOST_BIND_RETURN
};
dit que vous presque tout ce que vous devez savoir, vraiment.
L'en-tête bind_template
se développe en une liste de définitions en ligne operator()
. Par exemple, le plus simple:
result_type operator()()
{
list0 a;
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
On peut voir les BOOST_BIND_RETURN
macro à return
se dilate à ce point si la ligne est plus comme return l_(type...)
.
La seule version du paramètre est ici:
template<class A1> result_type operator()(A1 & a1)
{
list1<A1 &> a(a1);
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
Il est assez similaire.
Les classes listN
sont des wrappers pour les listes de paramètres. Il y a beaucoup de magie profonde ici que je ne comprends pas trop. Ils ont également surchargé operator()
qui appelle la mystérieuse fonction unwrap
. Ignorer quelques surcharges spécifiques du compilateur, il ne fait pas beaucoup:
// unwrap
template<class F> inline F & unwrap(F * f, long)
{
return *f;
}
template<class F> inline F & unwrap(reference_wrapper<F> * f, int)
{
return f->get();
}
template<class F> inline F & unwrap(reference_wrapper<F> const * f, int)
{
return f->get();
}
La convention de nommage semble être: F
est le type du paramètre de fonction bind
. R
est le type de retour. L
a tendance à être une liste de types de paramètres. Il y a aussi beaucoup de complications car il n'y a pas moins de neuf surcharges pour différents nombres de paramètres. Il vaut mieux ne pas trop insister là-dessus.
Je pense que c'est une classe modèle qui déclare une variable membre pour les arguments que vous voulez lier et surcharge() pour le reste des arguments.
Par ailleurs, si bind_t
est réduite et simplifiée en incluant boost/bind/bind_template.hpp
, il devient plus facile de comprendre comme ce qui suit:
template<class R, class F, class L>
class bind_t
{
public:
typedef bind_t this_type;
bind_t(F f, L const & l): f_(f), l_(l) {}
typedef typename result_traits<R, F>::type result_type;
...
template<class A1>
result_type operator()(A1 & a1)
{
list1<A1 &> a(a1);
return l_(type<result_type>(), f_, a, 0);
}
private:
F f_;
L l_;
};
- 1. Comment fonctionne Linq (dans les coulisses)?
- 2. Comment allez-SQL Server effectuer cette requête dans les coulisses
- 3. Les tests Intellisense boost :: boost :: boost :: boost :: boost :: boost :: classname ....... pourquoi?
- 4. Comment setTimeout est-il implémenté dans les interpréteurs javascript ou les timers en général?
- 5. Comment passer paramètre dans Silverlight pour qu'il soit "dans les coulisses"
- 6. Dans Eclipse 3.5: Réécriture import xsl/include emplacement dans les coulisses il validera correctement les fichiers
- 7. Décalage général pour toutes les ancres en HTML?
- 8. comment boost :: fonction et boost :: bind travail
- 9. Comment combiner et optimiser un prédicat, en général?
- 10. Multicast général pragmatique sur Winsock
- 11. Question de préchargement d'image en général
- 12. articles sur les polices dans Linux ou les polices en général
- 13. jQuery - Les animations et les scripts jQuery en général sont-ils plus rapides dans IE?
- 14. boost :: filter_iterator - comment le ferais-je avec le STL?
- 15. en utilisant boost :: mpl :: bitor_
- 16. Utilisation de Boost Graph Library: property_map dans boost :: mutable_queue
- 17. Comment boost utilise-t-il les signaux et les slots?
- 18. Comment gérer l'envoi de messages de bienvenue xmpp lorsque les utilisateurs s'abonnent au bot (en général)
- 19. Y compris les bibliothèques boost dans les fichiers make
- 20. Général mysql freeze
- 21. Que se passe-t-il dans les coulisses lors de l'exécution de aspnet_regsql?
- 22. Comment obtenir la largeur du bouton dans DateTimePicker-Control/Controls en général?
- 23. « Impossible de convertir le paramètre » en utilisant boost :: variante iterator
- 24. Problèmes avec boost :: ptr_vector et boost :: tout
- 25. Initialiser un polygone en boost :: géométrie
- 26. Qu'est-ce que la "sécurité déclarative"? En général
- 27. boost :: asio: Comment utiliser async_accept pour accepter les connexions entrantes?
- 28. CherryPy, charger l'image de matplotlib, ou en général
- 29. Schéma général Commandement et modèle de répartition en Python
- 30. Formater des éléments en ligne? À quoi ressemble le code général?
cela ne semble pas simple pour moi ... pourquoi le '# define BOOST_BIND_RETURN return' nécessaire? pourquoi ne pas simplement revenir? – Ha11owed
Je ne comprends toujours pas. Qu'est-ce qui appelle le constructeur à 'bind_t'? – ThomasMcLeod
@ Ha11owed parce que de cette façon, ils peuvent utiliser l'en-tête pour les modèles qui n'ont pas de valeur de retour! –