2013-08-16 6 views
2

template< typename F > using T = boost::variant< F, F const >; 유형을 만들어 읽기 전용 및 읽기/쓰기 가능한 액세스 가능한 값을 동일한 std::vector<T>에 저장하려고합니다. 하지만 다음과 같은 프로그래밍 문제가 있습니다.const :: const 및 non-const의 변형 ::

#include <iostream> 
#include <cstdlib> 

#include <boost/variant.hpp> 

int main() 
{ 
    using F = double; 
    using CV = boost::variant< F const, F >; 
    F const c = 0.0; 
    CV C(c); 
    F v = 0.0; 
    CV V(v); 
    std::cout << C.which() << ' ' << V.which() << std::endl; 
    return EXIT_SUCCESS; 
} 

출력 : 1 1. F 유형의 값 const 버전을 어떻게 저장할 수 있습니까?

+0

먼저 __why __ ...를 이해하고 해결 방법을 찾아보십시오. 나는 boost :: variant'의 내용을 조금 파고 그것을 호출 한 다른 변형 (즉,'const'와'nonconst')을 초기화하기 위해 그것을 발견했지만'const' 매개 변수에 대해 유효하지 않은 인덱스를 반환합니다. 'index'는 이니셜 라이저 타입의 일부입니다. 버그 (또는 아마도 feature)가 있습니다 ... 그래서 boost :: detail :: variant :: make_initializer_node'를 보시면됩니다. boost/variant/detail/initializer.hpp의 111 행 주위) – zaufi

+0

@ zaufi 나는 시도 할 것이다. 그러나 이해하기가 너무 어려워 보입니다. – Orient

+0

다른 사람들이 작성한 코드를 읽고 이해하는 것은 어쨌든 매우 유용한 기술입니다. 개발할 기회를 활용하십시오! :)) – zaufi

답변

0

이 솔루션 아니지만, 뭔가 유용한는 :

#include <iostream> 
#include <functional> 
#include <cstdlib> 

#include <boost/variant.hpp> 

int main() 
{ 
    using F = double; 
    using CV = boost::variant< std::reference_wrapper< F const >, std::reference_wrapper<F> >; 
    F const c = 0.0; 
    CV C(std::ref(c)); 
    F v = 0.0; 
    CV V(std::ref(v)); 
    std::cout << C.which() << ' ' << V.which() << std::endl; 
    return EXIT_SUCCESS; 
} 

이있는 경우 데이터를 저장하기 위해 추가 공간이 필요합니다. 어떤 경우에는 질문의 원래 공식에서 하나보다 더 적절할 수 있습니다.