@@ -39,24 +39,6 @@ void dump_value(std::ostream & out, const T & v)
3939
4040extern void dump_value (std::ostream & out, const std::string & v);
4141
42- // type names helper
43- template <typename >
44- struct type_name {
45- static char const * value () { return " unknown" ; }
46- };
47-
48- template <> struct type_name <int > {
49- static char const * value () { return " int" ; }
50- };
51-
52- template <> struct type_name <double > {
53- static char const * value () { return " fp" ; }
54- };
55-
56- template <> struct type_name <std::string> {
57- static char const * value () { return " string" ; }
58- };
59-
6042class ArgParser
6143{
6244 public:
@@ -71,13 +53,20 @@ class ArgParser
7153
7254 ArgParser & add (const char * optname, const char * description, ArgParserCallBack callback = nullptr );
7355
56+ /*
57+ * location == nullptr means no argument is needed
58+ */
7459 template <class T , class Tv >
75- ArgParser & add (const char * optname, T * location, const Tv & default_value, const char * description, ArgParserCallBack callback = nullptr , bool dont_show_default = false );
60+ ArgParser & add (const char * optname, T * location, const Tv & default_value, const char * description, ArgParserCallBack callback = nullptr , bool dont_show_default = false );
7661
7762 void parse (int argc, char ** argv) const ;
7863 void show_usage (std::ostream & out) const ;
7964
8065 private:
66+ // type names helper
67+ template <class >
68+ static const char * get_type_name (void ) { return " unknown" ; }
69+
8170 class ArgEntryBase
8271 {
8372 public:
@@ -127,6 +116,11 @@ ArgParser & ArgParser::add(const char * optname, T * location, const Tv & defaul
127116 return *this ;
128117}
129118
119+ // Known types
120+ template <> const char * ArgParser::get_type_name<int > (void );
121+ template <> const char * ArgParser::get_type_name<double > (void );
122+ template <> const char * ArgParser::get_type_name<std::string> (void );
123+
130124template <class T , class Tv >
131125ArgParser::ArgEntry<T, Tv>::ArgEntry(const char * name, T * location, const Tv & default_value, ArgParserCallBack callback, const char * description, bool dont_show_default)
132126 : ArgEntryBase(name, description, (location != nullptr ))
@@ -178,7 +172,7 @@ void ArgParser::ArgEntry<T, Tv>::show_usage(std::ostream & out) const
178172
179173 if (need_arg)
180174 {
181- sout << " <" << type_name <T>:: value () << " >" ;
175+ sout << " <" << get_type_name <T>() << " >" ;
182176 }
183177
184178 std::string s = sout.str ();
0 commit comments