2013-04-28 9 views
2

부스트 스피릿 퀴를 사용하여 인바운드 데이터를 구문 분석 한 다음 내용에 따라 올바른 기능을 디스패치합니다.phoenix bind로 부스트 신호를 바인딩하십시오.

boost::signals을 사용하여 콜백을 관리합니다. 내 문제는 부스터 신호로 phoenix bind를 사용할 수없는 것 같다. 오류의 벽을 침,이 컴파일되지 않습니다

#include <boost/signals.hpp> 

#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/phoenix_bind.hpp> 
#include <boost/spirit/include/phoenix_core.hpp> 

#include <iostream> 

void f(int i) { 
    std::cout << i << '\n'; 
} 

int main() { 
    boost::signal<void(int)> sig; 

    sig.connect(f); 

    std::string s="123"; 
    auto first=s.cbegin(), last=s.cend();  

    boost::spirit::qi::parse(
     first, last, 
     (
      boost::spirit::qi::int_ 
      [ 
       boost::phoenix::bind(sig, boost::spirit::qi::_1) 
      ] 
     ) 
    ); 
} 

:

는 다음 테스트 케이스를 생각해 보자. 내가 예상대로 작동

boost::phoenix::bind(&f, boost::spirit::qi::_1) 

와 피닉스 바인드 선을 대체하는 경우 (단 인해 프로그램의 큰 디자인이 가능하지 않다) 것을

참고.

미리 감사드립니다.

+0

위'높일 수있는 라인 :: 바인드 변경하려는 경우 컴파일 것 (부스트 :: REF (시그), _1) '(적절한 헤더를 포함). 그러나 어떤 이유로 나는 phoenix와 함께 ref로'sig'를 전달하지 못했습니다. –

답변

4

Igor R.의 의견에서 언급했듯이 원래의 오류는 phoenix::bind이 기본적으로 인수를 복사하고 복사 할 수 없기 때문입니다. phoenix::ref을 사용하면이를 해결하기 위해 Boost.Phoenix v2가 반환 된 유형을 찾을 수 없기 때문에 발생하는 또 다른 오류가 발생합니다. 이것은 BOOST_SPIRIT_USE_PHOENIX_V3을 정의하면 쉽게 해결할 수 있습니다.

#include <boost/signals.hpp> 

#define BOOST_SPIRIT_USE_PHOENIX_V3 
#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/phoenix_bind.hpp> 
#include <boost/spirit/include/phoenix_core.hpp> 

#include <iostream> 

void f(int i) { 
    std::cout << i << '\n'; 
} 

int main() { 
    boost::signal<void(int)> sig; 

    sig.connect(f); 

    std::string s="123"; 
    auto first=s.cbegin(), last=s.cend();  

    boost::spirit::qi::parse(
     first, last, 
     (
      boost::spirit::qi::int_ 
      [ 
       boost::phoenix::bind(boost::phoenix::ref(sig), boost::spirit::qi::_1) 
      ] 
     ) 
    ); 
} 
+0

+1 (아무 것도 말하지 않고 :) (우리는 방금 지구상에서 2 명의 사람들이 여전히 은색 배지를 늘리는 방법을 논의했습니다.) (http://chat.stackoverflow.com/transcript/message/9102711#9102711). .., 나는 기여 인자의리스트에 "익명의 수혜자"를 추가 할 것이다. – sehe

+0

아, 아직도 디폴트로 v2이다 ... 나는 phoenix :: bind를 명시 적으로 넣으려고했지만 을 명시 적으로 컴파일했지만 컴파일되지 않았다. –

+0

우수, 정말 고마워요! – 111111