Boost logo

Boost Users :

Subject: [Boost-users] [program options] vectro from config file
From: Diederick C. Niehorster (dcnieho_at_[hidden])
Date: 2009-07-13 06:57:45


Hi All,

I can't find an answer to this before, so I'll ask here.

I would like to read a vector from a config file using program_options.

example definition of option:
("Expt.ControlOrd", po::value<vector<int>>(&_pcData->SetExptOrders()),
"Expt.ControlOrd")

In the config file, the following works:
ControlOrd = 1
ControlOrd = 2

But i would much prefer to use:
ControlOrd = 1 2 or
ControlOrd = (1 2)
or something like that.

I have made this work by editing the sourcecode, diff:

----
Index: config_file.cpp
===================================================================
--- config_file.cpp     (revision 54915)
+++ config_file.cpp     (working copy)
@@ -12,6 +12,8 @@
 #include <boost/program_options/detail/convert.hpp>
 #include <boost/throw_exception.hpp>
+#include <boost/algorithm/string.hpp>
+
 #include <iostream>
 #include <fstream>
 #include <cassert>
@@ -112,8 +114,17 @@
                     found = true;
                     this->value().string_key = name;
                     this->value().value.clear();
-                    this->value().value.push_back(value);
                     this->value().unregistered = !registered;
+
+                    if (*value.begin() == '(' && *value.rbegin() == ')')
+                    {
+                        value = value.substr(1, value.size()-2);
+                        vector<string> SplitVec;
+                        split( SplitVec, value, is_any_of(" ") );
+                        this->value().value.swap(SplitVec);
+                    }
+                    else
+                        this->value().value.push_back(value);
                     break;
                 } else {
----
Of course, this is not a great solution as it doesn't allow you to
read strings starting with ( and ending with ). Well, it is missing
one thing. If we could somehow check that the datatype requested for
this options is a vector, we could add that check to the if.
I think that leaves only one problem, that of reading a vector of strings.
Please tell me if it is possible to check for the requested type at
this point in the code and how to do it. Any other comments also very
welcome!
I'll suggest it to the author once it works well.
Thank you,
Diederick

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net