@Rost가 이전에 언급했듯이 방문자 패턴은 여기에서 좋은 선택입니다. PO와 함께 사용하려면 옵션이 전달되면 알리미가 boost::variant
값의 항목을 채울 수 있도록 옵션에 알리미를 사용해야합니다. 세트는 별도로 보관해야합니다. 그런 다음 세트를 반복하고 boost::apply_visitor
을 사용하여 작업 (즉, 인쇄)을 자동으로 처리 할 수 있습니다. 방문객을위한
은, 사실, 방문객 및 일반 접근 방식의 사용이 더 광범위하게 boost::static_visitor<>
에서 상속합니다.
설명을 포함하는 class MyOption
을 작성했으며 암시 적, 기본값 등과 같은 기타 옵션은 boost::variant
입니다. 템플릿을 통해 PO 옵션 (boost::po::options_add()
참조)에 대해 PO와 같은 방식으로 MyOption
유형의 객체 벡터를 채 웁니다. 또는 을 boosts::varian
t로 전달할 때 값의 유형 및 기본값 (암시 적)과 같은 다른 것들을 채 웁니다.
그 후 컨테이너를 채우기 위해 Visitor 패턴을 사용했습니다. boost::po
에는 입력 명령 행을 구문 분석하기위한 구조가 필요하기 때문입니다. 작성하는 동안 각 옵션에 대해 알림을 설정합니다. boost::po
이 전달되면 MyOption
의 원래 개체가 자동으로 채워집니다.
다음으로 po::parse
과 po::notify
을 실행해야합니다. 그 후 boost :: variant 내부에 visitor 패턴을 통해 이미 채워진 std::vector<MyOption*>
을 사용할 수 있습니다.
무엇이 좋을까요? std::vector<MyOption*>
을 작성할 때 코드에 한 번만 옵션 유형을 작성해야합니다.
추신. 이 접근법을 사용하는 경우 값이없는 옵션에 대한 알림을 설정하는 문제가 발생하는 경우 솔루션을 얻으려면 다음 주제를 참조하십시오. boost-program-options: notifier for options with no value
PS2. 코드 예 :
std::vector<MyOptionDef> options;
OptionsEasyAdd(options)
("opt1", double(), "description1")
("opt2", std::string(), "description2")
...
;
po::options_descripton boost_descriptions;
AddDescriptionAndNotifyerForBoostVisitor add_decr_visitor(boost_descriptions);
// here all notifiers will be set automatically for correct work with each options' value type
for_each(options.begin(), options.end(), boost::apply_visitor(add_descr_visitor));
링크 및 RTTI에 대한 아이디어를 주셔서 감사합니다 . 형식이 증가하면 관리해야하는 모든 지원되는 형식의 구조를 만들지 못하게 할 수 있었으면 좋겠지 만 이는 불가능할 것으로 보입니다. 기본적으로, 나는 형에 건네 주길 원했습니다. 연산자가 'operator <<'를 지원한다면 모든 것이 정상적으로 작동합니다. 그렇지 않으면 컴파일이 실패해야합니다. – shiin