Resolve template recursion in add_parents method

This commit is contained in:
Stephan van Veen 2019-05-11 13:33:08 +02:00
parent 3bd7b342f0
commit ecf8286c9e

View File

@ -325,30 +325,24 @@ class ArgumentParser {
return *tArgument; return *tArgument;
} }
// Base case for add_parents parameter packing // Parameter packed add_parents method
void add_parents() { // Accepts a variadic number of ArgumentParser objects
for (const auto& tParentParser : mParentParsers) { template<typename... Targs>
auto tPositionalArguments = tParentParser.mPositionalArguments; void add_parents(Targs... Fargs) {
for (auto& tArgument : tPositionalArguments) { const auto tNewParentParsers = {Fargs...};
mPositionalArguments.emplace_back(tArgument); for (const auto& tParentParser : tNewParentParsers) {
} const auto& tPositionalArguments = tParentParser.mPositionalArguments;
auto tOptionalArguments = tParentParser.mOptionalArguments; std::copy(std::begin(tPositionalArguments), std::end(tPositionalArguments), std::back_inserter(mPositionalArguments));
for (auto& tArgument : tOptionalArguments) {
mOptionalArguments.emplace_back(tArgument); const auto& tOptionalArguments = tParentParser.mOptionalArguments;
} std::copy(std::begin(tOptionalArguments), std::end(tOptionalArguments), std::back_inserter(mOptionalArguments));
auto tArgumentMap = tParentParser.mArgumentMap;
for (auto&[tKey, tValue] : tArgumentMap) { const auto& tArgumentMap = tParentParser.mArgumentMap;
for (const auto&[tKey, tValue] : tArgumentMap) {
mArgumentMap.insert_or_assign(tKey, tValue); mArgumentMap.insert_or_assign(tKey, tValue);
} }
} }
} std::move(std::begin(tNewParentParsers), std::end(tNewParentParsers), std::back_inserter(mParentParsers));
// Parameter packed add_parents method
// Accepts a variadic number of ArgumentParser objects
template<typename T, typename... Targs>
void add_parents(T aArgumentParser, Targs... Fargs) {
mParentParsers.emplace_back(aArgumentParser);
add_parents(Fargs...);
} }
/* Call parse_args_internal - which does all the work /* Call parse_args_internal - which does all the work