acerca de boost::bind y como resolver cuando hay funciones sobrecargadas

19 views
Skip to first unread message

Hernán Leoni

unread,
Apr 25, 2013, 12:43:56 PM4/25/13
to cp...@googlegroups.com

hola gente,

una consultita acerca del bind de boost y como resolver cuando hay funciones sobrecargadas

tengo este escenario donde quiero recorrer un rango iterable y con cada item hacer algo que devuelve un string, luego meter ese string en un vector
acá el código


void foo() {
....

std::vector<std::string> result;

std::for_each(_someiterable->begin(), _someiterable->end(),
    boost::bind(&std::vector<std::string>::push_back, &result, boost::bind(...otro binding que devuelve un std::sting...)));

....
}

esto en principio andaba hasta que le puse al compilador el flag -std=c++0x
una vez puesto ese flag el compilador no sabe si bindear contra el push_back(const string &) o el push_back(string &)
con lo cual hice lo siguiente



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

la otra opción era especificar bien en el bind  que funcion quería yo, pero si tengo que hacerlo se vuelve ilegible y termino escribiendo más que si hago el for tradicional.

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

gracias

hernan

Ramiro del Corro

unread,
Apr 25, 2013, 1:04:19 PM4/25/13
to cp...@googlegroups.com
Segun http://www.cplusplus.com/reference/vector/vector/push_back/ en c++11 se agrega el push_back(string&) (lo cual no entiendo por que querrias q no sea const). Para arreglar tu problema se puede retornar un const string en el segundo binding? 

Saludos
Ramiro


2013/4/25 Hernán Leoni <leoni....@gmail.com>

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a cppba+un...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

Ramiro del Corro

unread,
Apr 25, 2013, 1:05:29 PM4/25/13
to cp...@googlegroups.com
ups era &&, ahora si q no entiendo pq da ambiguo.


2013/4/25 Ramiro del Corro <ramiro.d...@gmail.com>

Agustín K-ballo Bergé

unread,
Apr 25, 2013, 1:29:17 PM4/25/13
to cp...@googlegroups.com
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

Agustín K-ballo Bergé

unread,
Apr 25, 2013, 1:32:38 PM4/25/13
to cp...@googlegroups.com
Hern�n,

Me olvidaba comentar lo siguiente...

On 25/04/2013 01:43 p.m., Hern�n Leoni wrote:
> std::for_each(_someiterable->begin(), _someiterable->end(),
> boost::bind(&std::vector<std::string>::push_back, &result,
> boost::bind(...otro binding que devuelve un std::sting...)));

Para este caso de uso en particular, pod�s usar `transform`:

std::transform(
_someiterable->begin(), _someiterable->end()
, std::make_back_inserter( result )
, boost::bind(...otro binding que devuelve un std::sting...)
);

http://en.cppreference.com/w/cpp/algorithm/transform

Fernando Pelliccioni

unread,
Apr 28, 2013, 11:33:21 AM4/28/13
to cp...@googlegroups.com



2013/4/25 Hernán Leoni <leoni....@gmail.com>

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a cppba+un...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 


No llegué a leer toda la conversación, pero si C++11 es una opción... fijate si esto te sirve.


Saludos,
FP. 

Hernán Leoni

unread,
Apr 28, 2013, 7:02:22 PM4/28/13
to cp...@googlegroups.com
muchas gracias
en principio por ahora c++11 no estamos usando ya que el compilador actual no lo soporta
gracias por la sugerencia del trasnform, lo voy a probar, parece ser exactamente lo que busco !!!
un saludo
hernan
Reply all
Reply to author
Forward
0 new messages