2017-11-04 4 views
0

나는부스트 program_options : 명령 줄 매개 변수로 3D 벡터에서 읽기는

boost::program_options::options_description desc("Required options");            
desc.add_options()(                            
    detail::enu_orig_lat_opt,            
    boost::program_options::value<float>(),         
    "Origin of enu latitudinal coordinates."                   
)(                            
    detail::enu_orig_lng_opt,            
    boost::program_options::value<float>(),         
    "Origin of enu longitudinal coordinates."                  
)(                            
    detail::enu_orig_alt_opt,            
    boost::program_options::value<float>(),         
    "Origin of enu altitude coordinates."                  
); 

가 나는 multitoken 값을 갖는 하나의 옵션을 사용하고 유형 std::vector<float> 될하거나 내가 세 개의 필드와 구조체를 사용할 수 수 있습니다 그 유형의 값을 사용하십시오. 지금까지 나는이 두 가지 옵션으로 어려움을 겪었으므로 이들을 작동시키지 못했습니다. 위의 옵션 (코드 참조)의 문제점은 사용자가 다른 값의 존재를 확인하기 위해 코드를 추가해야하는 값 중 하나만 지정하는 경우입니다.

그래서 두 가지 질문이 있습니다. 하나는, 사람이 명령 줄 옵션으로 부정적인 수레를 포함하여 3d 벡터를 읽는 샘플 코드가 있습니까? 또는 둘 이상이 설정되어있는 경우 세 가지 관련 옵션이 모두 지정되도록하는 이상적인 방법은 무엇입니까? 옵션 그룹을 검증하는 주제에

답변

2

이 관련된 대답을 참조하십시오 c++/boost program_options one option disable other

가장 간단한 방법은 벡터 유형 istreamable 수 있도록하는 것입니다 :

Live On Wandbox

#include <iosfwd> 
#include <istream> 

template <typename T> struct LLA { 
    T lat, lon, alt; 
    friend std::istream& operator>>(std::istream& is, LLA& lla) { 
     char ch; 
     if (is >> lla.lat >> ch && ch == ';' 
     && is >> lla.lon >> ch && ch == ';' 
     && is >> lla.alt) 
      return is; 
     is.setstate(std::ios::failbit); 
     return is; 
    } 
}; 

using Origin = LLA<float>; 

#include <boost/program_options.hpp> 
#include <iostream> 

namespace po = boost::program_options; 

int main(int argc, char** argv) { 
    Origin origin; 

    po::options_description desc; 
    desc.add_options() 
     ("origin,o", po::value(&origin), "origin of enu (lat;lon;alt)") 
     ; 

    auto parsed = po::parse_command_line(argc, argv, desc, po::command_line_style::default_style); 
    po::variables_map vm; 
    po::store(parsed, vm); 
    po::notify(vm); 

    std::cout << "Origin: lat:" << origin.lat << " lon:" << origin.lon << " alt:" << origin.alt << "\n"; 
} 

윌 인쇄 예

Origin: lat:3 lon:-5 alt:7 

예 :

./test --origin='3;-5;7' 
./test --origin '3;-5;7' 
./test -0 '3;-5;7'