Skip to content

Commit b12c27e

Browse files
committed
using stream iterators
1 parent bb85080 commit b12c27e

3 files changed

Lines changed: 26 additions & 24 deletions

File tree

README.md

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,28 @@ Here is a simple example
99
#include "argparse.h"
1010

1111
int main(int argc, char* argv[]) {
12-
// run as: [program name] -a 1 --flag -v 1 2.7 3 4 9 8.12 87 6 -sdf
13-
ArgumentParser parser("Argument parser example");
14-
parser.add_argument("-a", "an integer");
15-
parser.add_argument("-s", "an combined flag", true);
16-
parser.add_argument("-d", "an combined flag", true);
17-
parser.add_argument("-f", "an combined flag", true);
18-
parser.add_argument("--flag", "a flag");
19-
parser.add_argument("-v", "a vector", true);
20-
try {
21-
parser.parse(argc, argv);
22-
} catch (const ArgumentParser::ArgumentException& ex) {
23-
std::cout << ex.what() << std::endl;
24-
return 0;
25-
}
26-
if (parser.is_help()) return 0;
27-
std::cout << parser.get<int>("a") << std::endl;
28-
std::cout << (parser.get<bool>("flag") ? "true" : "false") << std::endl;
29-
std::cout << (parser.get<bool>("d") ? "true" : "false") << std::endl;
30-
for (auto i : parser.getv<double>("v")) std::cout << i << " : ";
31-
std::cout << std::endl;
12+
// run as: [program name] -a 1 -sdf --flag -v 1 2.7 3 4 9 8.12 87 6
13+
ArgumentParser parser("Argument parser example");
14+
parser.add_argument("-a", "an integer");
15+
parser.add_argument("-s", "an combined flag", true);
16+
parser.add_argument("-d", "an combined flag", true);
17+
parser.add_argument("-f", "an combined flag", true);
18+
parser.add_argument("--flag", "a flag");
19+
parser.add_argument("-v", "a vector", true);
20+
try {
21+
parser.parse(argc, argv);
22+
} catch (const ArgumentParser::ArgumentNotFound& ex) {
23+
std::cout << ex.what() << std::endl;
3224
return 0;
25+
}
26+
if (parser.is_help()) return 0;
27+
std::cout << parser.get<int>("a") << std::endl;
28+
std::cout << (parser.get<bool>("flag") ? "true" : "false") << std::endl;
29+
std::cout << (parser.get<bool>("d") ? "true" : "false") << std::endl;
30+
auto v = parser.getv<double>("v");
31+
std::copy(v.begin(), v.end(), std::ostream_iterator<double>(std::cout, " "));
32+
if (v.size()) std::cout << std::endl;
33+
return 0;
3334
}
3435
```
3536

argparse.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ class ArgumentParser {
109109
std::string argstr = get<std::string>(name);
110110
std::vector<T> v;
111111
std::istringstream in(argstr);
112-
T t;
113-
while (in >> t >> std::ws) v.push_back(t);
112+
std::copy(std::istream_iterator<T>(in), std::istream_iterator<T>(),
113+
std::back_inserter(v));
114114
return v;
115115
}
116116

example.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ int main(int argc, char* argv[]) {
3636
std::cout << parser.get<int>("a") << std::endl;
3737
std::cout << (parser.get<bool>("flag") ? "true" : "false") << std::endl;
3838
std::cout << (parser.get<bool>("d") ? "true" : "false") << std::endl;
39-
for (auto i : parser.getv<double>("v")) std::cout << i << " : ";
40-
std::cout << std::endl;
39+
auto v = parser.getv<double>("v");
40+
std::copy(v.begin(), v.end(), std::ostream_iterator<double>(std::cout, " "));
41+
if (v.size()) std::cout << std::endl;
4142
return 0;
4243
}

0 commit comments

Comments
 (0)