Hola Hern�n,
On 25/04/2013 01:43 p.m., Hern�n Leoni wrote:
>
> hola gente,
>
> una consultita acerca del bind de boost y como resolver cuando hay
> funciones sobrecargadas
(...)
> void push_back(std::vector<std::string> & v, std::string const & s) {
> v.push_back(s);
> }
>
>
> void foo() {
> ....
>
> std::vector<std::string> result;
> std::for_each(someiterable->begin(), _someiterable->end(),
> boost::bind(&push_back, std::ref(result),
> boost::bind(&t_applications_registry_entry::app_id, _1)));
> ....
> }
>
> esto compila sin problemas, pero un embole tener que escribir la
> funcion extra
Puede ser un 'embole', pero bindear a funciones miembro de componentes
de la libreria standard no es algo que pueda hacerse en C++. El standard
deja libre a elecci�n del implementador si las funciones tienen
par�metros opcionales no especificados, y si eso se logra con par�metros
defaulteados o con sobrecarga de funciones. Esto quiere decir que no
pod�s saber cu�ntas sobrecagras de una funci�n miembro de un componente
de la libreria estandar existen, ni siquiera el tipo (signature) de las
mismas.
> mi consulta es si existe forma sencilla de desambiguar en el bind, o
> bien si existen utilidades como la funcion que yo hice para evitar
> reescribirlas
>
El bind puede desambiguarse mediante un cast al tipo (signature) de la
funci�n miembro, por ejemplo:
static_cast<void (std::vector<std::string>::*)(std::string
const&)>(&std::vector<std::string>::push_back)
Aunque puedo haberme equivocado en la sintaxis. De todos modos, como te
coment� antes, el tipo (signature) de dichas funciones no est�
especificado por el standard, asi que tu c�digo seguir�a teniendo los
mismos problemas de portabilidad que ten�as originalmente.
En C++11 ser�a posible generar alguna utilidad para autom�tizar la
creaci�n de funciones 'c�scara' como hiciste vos. Pero estando en C++11,
lo m�s conveniente ser�a usar una lambda y olvidarse del problema por
completo.
> gracias
>
> hernan
> --
Saludos,
Agust�n K-ballo Berg�.-
http://talesofcpp.fusionfenix.com