c++, std::map등의 pair 요소를 갖는 컨테이너에 std::tr1::bind 적용하기..
글쓴이: mika / 작성시간: 화, 2010/04/20 - 2:53오후
http://yesarang.tistory.com/348
#include
#include
#include
#include
struct C
{
void show() const { std::cout<< "C\n"; }
void operator()() const { std::cout<< "C\n"; }
typedef void result_type;
};
int main()
{
std::map m;
m.insert(std::make_pair(0, new C));
std::for_each(m.begin(), m.end(), std::tr1::bind(&C::show, std::tr1::bind(&std::map::value_type::second, std::tr1::placeholders::_1)));
}
여기서 std::tr1::bind(&std::map::value_type::second, std::tr1::placeholders::_1) 이 부분의 동작 원리가 잘 이해가 되질 않습니다. 어떻게 해서 second를 받아올까요? std::tr1::bind 소스는 제 수준으로는 분석이 안 되네요...
(본문에 소스만 따로 보기 좋게 올리는 방법도 알려주시면 감사드리겠습니다. _ _;;)
Forums:
자답
std::map::value_type &t = *m.begin();
std::map::value_type::second_type std::map::value_type::*st = &std::map::value_type::second;
(t.*st)->show();
멤버 자료에 대한 포인터로 이해하면 되는 거였군요.
앗.. 그러고 보니 본문이나 리플이나 모두 템플릿 인자가 다 삭제되었네요.
std::map[int, C*] 입니다.
자답하셨네요.
bind는 꼭 멤버함수만 functor로 만들수 있는게 아니라 멤버 변수도 access할 수 있게 해줍니다.
std::tr1::bind(&std::map::value_type::second, std::tr1::placeholders::_1)에서 _1 대신 map::value_type element가 들어가게 되고, map 에는 first, second 필드가 있는데 그 중에 second 필드에 대한 포인터를 넘겨주게 되는 것입니다.
블로그 보다가 여기로 링크가 걸려서 들러 봤습니다. ^^
댓글 달기