나는이 문제를 겪고 있었고, 그래서 해결책을 찾지 못했습니다. 알아내는 데는 시간이 걸렸으므로 다른 사람에게 유용 할 경우에 대비해 게시 할 생각이었습니다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와 같았습니까?
당신은 질문을 게시하고 답변 할 수 있다는 것을 알고 있습니다. 맞습니까? 이것은 아마도이 첫 번째 덩어리에 대한 최선의 방법 일 것입니다. 신호 문제에 관해서 왜지도 값을 참조로 선언 했습니까? – Useless
오타가 수정되었습니다. 나는 당신 자신의 질문에 답하는 것에 대해 몰랐다. - 고마워. – Ronnie