Skip to content

Commit b2ae01a

Browse files
committed
make type_name a member function
1 parent d987294 commit b2ae01a

File tree

2 files changed

+18
-20
lines changed

2 files changed

+18
-20
lines changed

src/util/ArgParser.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ void ArgParser::show_usage(ostream & out) const
146146
}
147147
}
148148

149+
template<> const char * ArgParser::get_type_name<int> (void) { return "int"; }
150+
template<> const char * ArgParser::get_type_name<double> (void) { return "fp"; }
151+
template<> const char * ArgParser::get_type_name<string> (void) { return "string"; }
152+
149153
ArgParser::ArgEntryBase::ArgEntryBase(const char * name, const char * description, bool need_arg)
150154
: shortname(0), name(name), description(description), need_arg(need_arg)
151155
{

src/util/ArgParser.h

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,6 @@ void dump_value(std::ostream & out, const T & v)
3939

4040
extern 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-
6042
class 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+
130124
template<class T, class Tv>
131125
ArgParser::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

Comments
 (0)