@@ -95,7 +95,8 @@ class ArgumentParser {
9595 size_t slen = std::strlen (argv[i]);
9696 if (slen == 0 ) {
9797 continue ;
98- } else if (slen >= 2 && argv[i][0 ] == ' -' && !isnumber (argv[i], slen)) {
98+ } else if (slen >= 2 && argv[i][0 ] == ' -' &&
99+ !_is_number (argv[i], slen)) {
99100 push_arg ();
100101 if (i == argc - 1 ) {
101102 name = &(argv[i][1 ]);
@@ -221,7 +222,20 @@ class ArgumentParser {
221222 _trim (s, f);
222223 return s;
223224 }
224- static inline bool isnumber (const char *arg, size_t len) {
225+ template <typename InputIt>
226+ inline std::string _join (InputIt begin, InputIt end,
227+ const std::string &separator = " " ) {
228+ std::ostringstream ss;
229+ if (begin != end) {
230+ ss << *begin++;
231+ }
232+ while (begin != end) {
233+ ss << separator;
234+ ss << *begin++;
235+ }
236+ return ss.str ();
237+ }
238+ static inline bool _is_number (const char *arg, size_t len) {
225239 if (std::isdigit (arg[0 ])) {
226240 return true ;
227241 } else if (len >= 2 ) {
@@ -253,9 +267,7 @@ inline std::string ArgumentParser::get<std::string>(const std::string &name) {
253267 if (_pairs.find (t) != _pairs.end ()) t = _pairs[t];
254268 auto v = _variables.find (t);
255269 if (v != _variables.end ()) {
256- return std::accumulate (
257- v->second .begin (), v->second .end (), std::string (),
258- [](std::string a, std::string b) { return a + " " + b; });
270+ return _join (v->second .begin (), v->second .end ());
259271 }
260272 return " " ;
261273}
0 commit comments