Sin pasar mucho tiempo revisando el código fuente de impulso, ¿podría alguien darme un resumen rápido de cómo se implementa el enlace boost?¿Cómo funciona el enlace de refuerzo entre bastidores en general?
Respuesta
me gusta esta pieza de la fuente 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
};
Le dice casi todo lo que necesita saber, de verdad.
El encabezado bind_template
se expande a una lista de definiciones en línea operator()
. Por ejemplo, el más simple:
result_type operator()()
{
list0 a;
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
podemos ver el BOOST_BIND_RETURN
expande macro a return
en este punto lo que la línea es más como return l_(type...)
.
El parámetro es una versión aquí:
template<class A1> result_type operator()(A1 & a1)
{
list1<A1 &> a(a1);
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
Es bastante similar.
Las clases listN
son envoltorios para las listas de parámetros. Hay una gran cantidad de magia profunda sucediendo aquí que realmente no entiendo demasiado. También han sobrecargado operator()
que llama a la misteriosa función unwrap
. Haciendo caso omiso de algunas sobrecargas específicas del compilador, que no hace mucho:
// 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();
}
El nombramiento parece ser: F
es el tipo de parámetro de la función de bind
. R
es el tipo de devolución. L
tiende a ser una lista de tipos de parámetros. También hay muchas complicaciones porque hay no menos de nueve sobrecargas para diferentes números de parámetros. Lo mejor es no pensar demasiado en eso.
Creo que es una clase de plantilla que declara una variable miembro para los argumentos que desea vincular y sobrecarga() para el resto de los argumentos.
Por cierto, si bind_t
se colapsa y simplificado mediante la inclusión de boost/bind/bind_template.hpp
, se hace más fácil de entender como la siguiente:
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. ¿Cómo funciona la coincidencia de patrones entre bastidores en F #?
- 2. ¿Cómo funciona el bundler (en general)?
- 3. ¿Cómo funciona el enlace en ActionScript?
- 4. proceso de pago de magento ... cómo funciona en general
- 5. ¿Cómo funciona un enlace?
- 6. En Ninject 2.0, ¿cómo puedo tener un enlace general y un enlace para un caso específico?
- 7. jQuery clic en el enlace no funciona
- 8. ¿Cómo funciona el enlace y la digestión en AngularJS?
- 9. ¿Puede alguien darme una descripción general de cómo funciona lucene.net?
- 10. ¿Cómo funciona el "enlace de Wikipedia" de Wikipedia?
- 11. ¿Cómo funciona el sistema de enlace permanente de WordPress?
- 12. ¿Funciona el enlace de datos en el control invisible?
- 13. Estilos CSS de refuerzo
- 14. ¿Cómo funciona Linq (detrás de escena)?
- 15. ¿Cómo funciona css3pie?
- 16. ¿Cómo funciona un enlace de descarga de JavaScript?
- 17. redireccionamiento de enlace no funciona en el proyecto de prueba
- 18. ¿Cómo funciona FallbackValue con un enlace múltiple?
- 19. El color del enlace CSS no funciona
- 20. ¿Cómo funciona el paquete?
- 21. Símbolo de refuerzo no encontrado
- 22. ¿Cómo obtengo el tamaño de pantalla general?
- 23. Aprendizaje de refuerzo con acciones variables
- 24. El método de envío MSXML2.XMLHTTP funciona con el enlace anticipado, falla con el enlace tardío
- 25. Diferencia entre enlace estático y enlace dinámico
- 26. ¿Cómo funciona nohup?
- 27. mailto: enlace en UIWebView - No funciona
- 28. ¿Por qué no funciona el enlace de datos a DynamicResource?
- 29. href = tel: 555 enlace no funciona en el safari móvil
- 30. Enlace de red entre varias máquinas VirtualBox
esto no parece simple para mí ... ¿Por qué el '# definir BOOST_BIND_RETURN return' necesario? ¿por qué no solo devuelve? – Ha11owed
Aún no lo entiendo. ¿Qué llama al constructor a 'bind_t'? – ThomasMcLeod
@ ¡Habilitado porque de esa manera pueden usar el encabezado para plantillas que no tienen valor de retorno! –