2013-03-03 5 views
1

맞춤 클래스를 사용하여 boost-variant을 시도했습니다. 클래스 내용에 안전하게 액세스하려면 boost::static_visitor을 사용하는 것으로 알고 있습니다. 왜 아래 코드가 컴파일되지 않는지 아십니까? 사용하기 위해 서명/선언에 대한 요구 사항은 boost::static_visitor입니까?맞춤 클래스를 사용하는 부스트 변형

나는이 질문을 발견했다. Why can't I visit this custom type with boost::variant? 그러나 나는 그것을 얻지 못했다. 모든

감사

AFG

#include <iostream> 
#include <algorithm> 
#include <boost/variant.hpp> 

struct CA{}; 

struct ca_visitor : public boost::static_visitor<CA> 
{ 
    const CA& operator()(const CA& obj) const { return obj;} 
}; 

struct CB{}; 

struct cb_visitor : public boost::static_visitor<CB> 
{ 
    const CB& operator()(const CB& obj) const { return obj;} 
}; 

int main(){ 
    typedef boost::variant< 
     CA 
     ,CB > v_type; 

    v_type v; 
    const CA& a = boost::apply_visitor(ca_visitor(), v); 
} 

답변

3

첫째, boost::static_visitor<>의 템플릿 인수는 호출 연산자에 의해 반환 유형을 지정해야합니다. 귀하의 경우 ca_visitor의 호출 연산자는 CA const&이 아니라 CA을 반환합니다.

하지만 가장 큰 문제는 아닙니다. 가장 큰 문제는 variant<>static_visitor<>이 어떻게 작동해야하는지에 대한 오해가있는 것 같습니다.

boost::variant<>의 아이디어는 의 값을 보유 할 수 있으며 템플릿 인수 목록에 지정하는 유형 중 하나가입니다. 당신은 그 타입이 무엇인지 알지 못하기 때문에, 가능한 경우 각각을 처리하기 위해 몇 가지 오버로드 된 호출 연산자를 방문자에게 제공합니다.

따라서 방문객에게 제공 할 경우 variant이 수용 할 수있는 유형을 허용하는 모든 필요한 과부하가 operator()인지 확인해야합니다. 그렇게하지 않으면 Boost.Variant가 컴파일 오류를 발생시킵니다 (일부 경우를 처리하는 것을 잊었 기 때문에 부탁합니다).

이것은 사용자가 직면 한 문제입니다. 방문객에게 CB 유형의 객체를 허용하는 호출 연산자가 없습니다. `v`;

방문의 입력 종류에 의한 타입 T의 *의 V '를 통해 구현 될 수있다
#include <iostream> 
#include <algorithm> 
#include <boost/variant.hpp> 

struct A{}; 
struct B{}; 

struct my_visitor : public boost::static_visitor<bool> 
//            ^^^^ 
//            This must be the same as the 
//            return type of your call 
//            operators 
{ 
    bool operator() (const A& obj) const { return true; } 
    bool operator() (const B& obj) const { return false; } 
}; 

int main() 
{ 
    A a; 
    B b; 
    my_visitor mv; 

    typedef boost::variant<A, B> v_type; 

    v_type v = a; 

    bool res = v.apply_visitor(mv); 
    std::cout << res; // Should print 1 

    v = b; 

    res = v.apply_visitor(mv); 
    std::cout << res; // Should print 0 
} 
+0

= (VAR)를 얻을 :

boost::variant<>static_visitor<>의 올바른 사용의 예 'var'가'T' 타입이 아닌 경우'nullptr'입니다. 이것은 취성이 있습니다. – Yakk

+0

@Yakk : 사실, OP가 방문객의 올바른 사용법을 묻고있는 것처럼 보입니다. –

+0

물론 : 방문을 기대하는 방식을 "방문하는"방법을 보여줌으로써 유용 할 수 있습니다. 대답을 모르는 사람은 거의 없습니다. – Yakk

관련 문제