3

composed()およびimplicit()として定義されたオプションの場合、boost program_options(v1_49)に問題があります。私の意図は、perlと同様の-Dオプションを実装して、-Dまたは-Dnameを実行し、それを複数回使用できるようにすることです。私のoptions_descriptionは次のとおりです。

(  "debug,D",
   bpo::value<vector<string> >()
         ->composing()
         ->implicit_value(vector<string>(1,"1")),
   "Set debug level."
),

これはほとんどの場合問題なく機能するようですが、コマンドラインに値のない-Dが表示されると、以前の値はすべて消去されます。例:

$ ./a.out -D abc -D 255 -D xyz
variables_map["debug"] = {"abc", "255", "xyz"}

$ ./a.out -D -D 255 -D xyz
variables_map["debug"] = {"1", "255", "xyz"}

$ ./a.out -D abc -D -D xyz
variables_map["debug"] = {"1", "xyz"}

$ ./a.out -D abc -D 255 -D
variables_map["debug"] = {"1"}

これが発生する理由がわかると思います。暗黙の値{"1"}は、既存のベクトルに追加するのではなく、既存のベクトルを置き換えます。これを機能させるために私ができることはありますか、それともboost :: program_optionsの制限ですか?

4

2 に答える 2

0

まあ、私は最終的に私のために働くように見える解決策を見つけました。可能であれば、流暢な誰かからの独立した検証があればいいのですboost::program_optionsが、どうやら誰もそれをあまり知らないか、気にかけていないようです。

これは、boost_1_49_0のパッチであり、オプションをcomposed()にすると同時に、implicit_value()を持つこともできます。

diff -Naur old/boost/program_options/detail/value_semantic.hpp new/boost/program_options/detail/value_semantic.hpp
--- old/boost/program_options/detail/value_semantic.hpp 2010-07-12 03:14:14.000000000 -0400
+++ new/boost/program_options/detail/value_semantic.hpp 2012-08-17 16:31:03.000000000 -0400
@@ -154,6 +154,28 @@
         }
     }

+    // Helper function to copy a non-vector implicit value into the
+    // tokens vector.
+    template<class T, class charT>
+    void get_implicit_tokens(std::vector<std::basic_string<charT> >& vs,
+                             const boost::any& a,
+                             T*, long) {
+        const T va = boost::any_cast<const T>(a);
+        vs.push_back(boost::lexical_cast<std::basic_string<charT> >(va));
+    }
+
+    // Helper function to copy a vector implicit value into the
+    // tokens vector.
+    template<class T, class charT>
+    void get_implicit_tokens(std::vector<std::basic_string<charT> >& vs,
+                             const boost::any& a,
+                             std::vector<T>*, int) {
+        const std::vector<T> va = boost::any_cast<const std::vector<T> >(a);
+        for (unsigned i = 0; i < va.size(); i++) {
+            vs.push_back(boost::lexical_cast<std::basic_string<charT> >(va[i]));
+        }
+    }
+
     template<class T, class charT>
     void 
     typed_value<T, charT>::
@@ -164,7 +186,14 @@
         // value, then assign the implicit value as the stored value;
         // otherwise, validate the user-provided token(s).
         if (new_tokens.empty() && !m_implicit_value.empty())
-            value_store = m_implicit_value;
+            if (m_composing) {
+                // Attempt to append the implicit value.
+                std::vector<std::basic_string<charT> > vs;
+                get_implicit_tokens(vs, m_implicit_value, (T*)0, 0);
+                validate(value_store, vs, (T*)0, 0);
+            } else {
+                value_store = m_implicit_value;
+            }
         else
             validate(value_store, new_tokens, (T*)0, 0);
     }
于 2012-08-17T21:11:31.907 に答える