2013-07-25 2 views
0

나는이 문제를 겪고 있었고, 그래서 해결책을 찾지 못했습니다. 알아내는 데는 시간이 걸렸으므로 다른 사람에게 유용 할 경우에 대비해 게시 할 생각이었습니다boost :: bind를 사용하여 std :: map에서 펑터를 호출하는 중

문제 : 저는 다른 유형의 펑터 집합을 가지고 있는데, 이것은 표준 :: map 다음에 switch 문/factory와 같은 종류의 호출을 호출합니다.

class Foo { 
public: 
    void operator() (int x) { 
     std::cout << "In foo" << x << std::endl; 
    } 
}; 
class Bar { 
public: 
    void operator() (int x) { 
     std::cout << "In Bar" << x << std::endl; 
    } 
}; 

이지도는

std::map<int,boost::function<void(int)>> maps; 

처럼 보인다 그리고 인서트는

maps.insert(std::make_pair(1,boost::bind(&Foo::operator(),Foo(),_1))); 

처럼 그리고 당신은 매우 간단 솔루션을 보면

auto iter = maps.find(1); 
iter->second(123); 

처럼 호출 할 수 있습니다 하나의 라이너, m 그것을 이해하려고 노력하는 체조 체조 - 오 잘 :)

내가 원래하려고했던 것은 boost :: signals2 :: 신호 객체를 저장하여지도에 공장을 연결할 수 있었지만 그걸 알아 냈어. 그래서 질문을 위해서, 어떻게지도에 그걸 저장하겠습니까?

std::map<std::string,boost::signals2::signal<void(int)>> m_factory; 
// Create the object I want to store 
boost::signals2::signal<void(int)> sig; 
sig.connect(Foo()); 
// This fails 
m_factory.insert(std::make_pair("Blah",sig)); 

하지만 난

std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert(std::pair<const _Kty,_Ty> &&)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> && 

편집 간체 더 예를

편집이 얻을 -이에

또한 참조하여지도를 선언 버그를 수정을,이 잘 작동하는 것 같습니다.

typedef boost::signals2::signal<void(int)> Signal; 
m_factory["Blah"] = Signal().connect(Foo()); 

논리적으로 make_pair와 같았습니까?

+0

당신은 질문을 게시하고 답변 할 수 있다는 것을 알고 있습니다. 맞습니까? 이것은 아마도이 첫 번째 덩어리에 대한 최선의 방법 일 것입니다. 신호 문제에 관해서 왜지도 값을 참조로 선언 했습니까? – Useless

+0

오타가 수정되었습니다. 나는 당신 자신의 질문에 답하는 것에 대해 몰랐다. - 고마워. – Ronnie

답변

1

boost :: signals는 복사 할 수 없으므로 표준 컨테이너에서 사용하기에 적합하지 않습니다. 당신은 (당신이 코드 here을 시도 할 수 있습니다)

typedef boost::signals2::signal<void(int)> sig; 
typedef std::shared_ptr<sig> pSig; 
typedef std::map<int, pSig> map_sig; 

void f(int){} 

int main(){ 
    pSig s(new sig); 
    s->connect(f); 

    map_sig m; 
    m.insert(map_sig::value_type(1, s)); 
} 

에서와 같이 신호에 대한 포인터 (아마도 스마트 포인터)를 사용해야합니다.

+0

이 작동하지만 다시 operator()로 변경하고 반환 형식을 추가 할 경우 않습니다. 그런 다음 다시 실패합니다. 여전히 첫 번째 부분에 대해 upvote – Ronnie

+0

http://coliru.stacked-crooked.com/view?id=46f24febb99398d9747092e00517111d-4c14052776b81b965e3761ffd8f9b825 아마 당신의 의견을 오해. upvoting 해줘서 고마워. 링크에서 찾은 내용이 귀하가 의미하는 바가 아니라면 알려주십시오. –