Tengo un mapa que almacena una estructura simple con una clave. La estructura tiene dos funciones miembro, una es const y la otra no. Logré llamar a la función const usando std :: for_each sin ningún problema, pero tengo algunos problemas para llamar a la función no const.Boost.Bind para acceder a los elementos de std :: map en std :: for_each
struct MyStruct {
void someConstFunction() const;
void someFunction();
};
typedef std::map<int, MyStruct> MyMap;
MyMap theMap;
//call the const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someConstFunction, boost::bind(&MyMap::value_type::second, _1)));
//call the non-const member function
std::for_each(theMap.begin(), theMap.end(),
boost::bind(&MyStruct::someFunction, boost::bind(&MyMap::value_type::second, _1)));
La llamada a la función miembro const funciona bien, pero parece impulsar internamente espera un MyStruct const en alguna parte, y por lo tanto se produce el siguiente error de compilación en MSVC7.1.
impulso \ bind \ mem_fn_template.hpp (151): error C2440: 'argumento': no se puede convertir de 'MyStruct const * __ W64' a 'MyStruct * const'
lo agradecería cualquier ayuda sobre cómo establecer los parámetros de la plantilla correctamente, de modo que bind reconoce los parámetros correctamente y me permite llamar a la función non const.
gracias, Carl
¿Qué tal si una copia de seguridad y nos dice lo que está realmente tratando de lograr aquí?Usar for_each con un mapa con boost :: bind * might * puede ser razonable, pero las posibilidades son bastante buenas de que un enfoque general diferente funcione mejor (muchas veces surge este tipo de pregunta, es porque 'std :: for_each' es una mala elección para la situación, y algo como 'std :: copy' o std :: accumulate' harían el trabajo mucho más simple). –
El MyStruct se usa en una especie de sistema de partículas, donde MyStruct es la partícula. La función const es una función draw(), la función non-const calcula la nueva posición. La clave en el mapa es la fecha de creación. De todos modos, en el momento en que publiqué la pregunta, se trataba más sobre cómo hacer ese trabajo que si este fuera un buen diseño al principio. – Carl