2011-10-27 5 views
0

부스트 방문자를 사용하여 유형 간 변환

boost::variant<std::string, int> myVariant; 

이 개체에서 데이터베이스의 데이터를 유지합니다. 일반적으로 정수 또는 텍스트이지만 때로는 데이터베이스에 텍스트로 저장된 시간입니다. 그래서 방문자를 만들 수 있는지 궁금합니다. 변형 된 객체를 문자열로 방문하면 'tm'유형의 구조체가 반환됩니다. 뭔가 그런 :

class timeVisitor : public boost::static_visitor<boost::shared_ptr<tm> > 
{ 
public: 
    boost::shared_ptr<tm> operator()(string &str) const 
    { 
     boost::shared_ptr<tm> dst(new tm()); 
     strptime(str.c_str(), "%Y-%m-%d", dst.get()); 
     return dst; 
    } 
}; 
그럼 그것을 사용하려면 :

사실, 그 방문자에 tm 구조체를 만들고 일부 공유 포인터와 엉망 싶지 않다 그리고 물건. 나는 방문자와 내부에 이미 생성 된 것을 초기화하는 것을 선호한다. 뭔가를 (사용의 의미에서) :

tm result; 
int returnCode = boost::apply_visitor(timeVisitor(result), myVariant); 

방문자가 strptime 내 결과 tm 구조체로 초기화됩니다 및 심지어 returnCode로 변환하는 데 문제가 있으면 반환합니다. 누구나 달성 할 수있는 방법을 알고 있습니까? 방문자에게 두 개의 매개 변수를 사용하는 방법을 정의 할 수 있습니까? 아니면 다른 무엇인가를 정의 할 수 있습니까?

답변

1

간단한 예제 호출이 작동해야합니다. 같은 참조를 받아이를 저장하는 방문자에 생성자를 추가

tm* target; 
timeVisitor(tm& a) : target(&a) {} 
int operator()(string &str) const { 
     strptime(str.c_str(), "%Y-%m-%d", target); 
} 
+0

예! 저것은 완벽하게 작동했습니다 ... 저는 약간의 푸시가 필요하다는 것을 알았지 만, 그러한 라이브러리는 때로는 조금 혼란 스럽습니다. 내가 몰랐던 것은 boost :: variant 을 가졌기 때문에 매개 변수로 int를 취하는 operator()를 정의해야한다는 것입니다. 그리고 오류 메시지에서 알기가 쉽지 않습니다. ( – pinpinokio

1

사실, 완벽하게 방문자를 생성시 인수를 제공 할 수 있습니다. (내 옆에 테스트하지 수, 약간의 구문 오류)

class timeVisitor : public boost::static_visitor<bool> 
{ 
public: 
    timeVisitor(tm& s):m_tm(s) {} 

    bool operator()(string &str) const 
    { 
     return strptime(str.c_str(), "%Y-%m-%d", m_tm.get()); 
     // in case of error, NULL pointer is converted to false automatically 
    } 
protected: 
    tm& m_tm; 
}; 
:해야 방문자가 어떻게 보이는지

다음
tm result; 
int returnCode = boost::apply_visitor(timeVisitor(result), myVariant); 

입니다 : 당신이 당신의 질문의 끝에서 작성한 코드는 그것을 할 수있는 좋은 방법입니다

+0

결과가 전달 될 때'shared_ptr'을 생성하는 이유는 무엇입니까? – Xeo

+0

@Xeo : 실제로 너무 성급했습니다. – Offirmo