正如@Rost前面提到的,訪客模式在這裏是一個不錯的選擇。要將其與PO一起使用,您需要爲選項使用通知符,以便在選項已通過的情況下,通知程序將填寫您的boost::variant
值集中的條目。該組應該分開存放。之後,您可以迭代您的設置並使用boost::apply_visitor
自動處理它們的動作(即打印)。
對遊客來說,從boost::static_visitor<>
繼承其實,我做了遊客和通用的方法使用更廣泛。
我創建了一個class MyOption
,其中包含說明boost::variant
的值和其他選項(如隱式,默認等)。我使用類似於PO爲其選項(請參閱boost::po::options_add()
)的方式填充類型爲MyOption
的對象向量。在通過std::string()
或double()
爲boosts::varian
t初始化時,您可以填充值的類型以及默認值,隱式等其他內容。
之後,我用訪客模式填充boost::po::options_description
容器,因爲boost::po
需要自己的結構來解析輸入命令行。在填寫期間,我爲每個選項設置了notifyer - 如果它將通過boost::po
將自動填充我的原始對象MyOption
。你需要執行po::parse
和po::notify
。之後,您將可以通過Visitor模式使用已填充的std::vector<MyOption*>
,因爲它內部保存了boost :: variant。
什麼是好所有這一切 - 你必須在代碼中只寫一次你的選項類型 - 當填寫你的std::vector<MyOption*>
。
PS。如果使用這種方法,您將面臨設置notifyer爲無值選項的問題,請參閱此主題以獲得解決方案: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