Mam mapę, która przechowuje prosty struct z kluczem. Struktura ma dwie funkcje składowe, jedna jest stała, a druga nie. Udało mi się wywołać funkcję const używając std :: for_each bez żadnych problemów, ale mam pewne problemy z wywołaniem funkcji non-const.Boost.Bind dostęp do elementów std :: map w 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)));
Wywołanie funkcji członka const działa dobrze, ale wydaje się wzmocnić wewnętrznie oczekuje const MyStruct gdzieś, a tym samym nie powiedzie się z powodu następującego błędu kompilacji w MSVC7.1.
doładowania \ wiążą \ mem_fn_template.hpp (151): error C2440: 'argumentem': nie można przekonwertować z 'const MyStruct * __ W64' do 'MyStruct * const'
bym docenić każdy pomoc w poprawnym ustawieniu parametrów szablonu, więc bind rozpoznaje poprawnie parametry i pozwala na wywołanie funkcji non const.
dzięki, Carl
A może zrób kopię zapasową i powiesz, co naprawdę chcesz osiągnąć?Używanie for_each z mapą z boost :: bind * może * być rozsądne, ale szanse są całkiem dobre, że inne ogólne podejście będzie działać lepiej (wielokrotnie pojawia się tego rodzaju pytanie, ponieważ 'std :: for_each' jest złym wyborem dla sytuacji, a coś takiego jak 'std :: copy' lub std :: accumulate' wykonałoby zadanie znacznie prościej). –
The MyStruct jest używany w systemie cząsteczkowym, w którym MyStruct jest cząstką. Funkcja const jest funkcją draw(), funkcja non-const oblicza nową pozycję. Kluczem na mapie jest data utworzenia. W każdym razie, w punkcie, w którym napisałem pytanie, chodziło raczej o to, jak wykonać tę pracę, niż gdyby to był dobry projekt na początku. – Carl