From 717e6aafdb30f4813796db8ad1c195506acbaccc Mon Sep 17 00:00:00 2001 From: Pranav Srinivas Kumar Date: Sat, 30 Mar 2019 13:47:59 -0400 Subject: [PATCH] Using enable_if and template specializations to deal with parser.get>(..) --- src/argparse.hpp | 33 +++++++++++++++++++++------------ tests/main.cpp | 2 +- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/argparse.hpp b/src/argparse.hpp index d11a032..9205019 100644 --- a/src/argparse.hpp +++ b/src/argparse.hpp @@ -4,9 +4,16 @@ #include #include #include +#include // C++0x namespace argparse { +template class Ref> +struct is_specialization : std::false_type {}; + +template class Ref, typename... Args> +struct is_specialization, Ref> : std::true_type {}; + template bool upsert(std::map& aMap, KeyType const& aKey, ElementType const& aNewValue) { typedef typename std::map::iterator Iterator; @@ -84,24 +91,24 @@ struct Argument { } template - std::vector get_list() { - std::vector tResult; + T get_vector() { + T tResult; if (mValues.size() == 0) { if (mDefaultValue != nullptr) { std::any tDefaultValueLambdaResult = mDefaultValue(); - std::vector tDefaultValues = std::any_cast>(tDefaultValueLambdaResult); + T tDefaultValues = std::any_cast(tDefaultValueLambdaResult); for (size_t i = 0; i < tDefaultValues.size(); i++) { - tResult.push_back(std::any_cast(tDefaultValues[i])); + tResult.push_back(std::any_cast(tDefaultValues[i])); } return tResult; } else - return std::vector(); + return T(); } else { if (mRawValues.size() > 0) { for (size_t i = 0; i < mValues.size(); i++) { - tResult.push_back(std::any_cast(mValues[i])); + tResult.push_back(std::any_cast(mValues[i])); } return tResult; } @@ -110,12 +117,12 @@ struct Argument { std::any tDefaultValueLambdaResult = mDefaultValue(); std::vector tDefaultValues = std::any_cast>(tDefaultValueLambdaResult); for (size_t i = 0; i < tDefaultValues.size(); i++) { - tResult.push_back(std::any_cast(tDefaultValues[i])); + tResult.push_back(std::any_cast(tDefaultValues[i])); } return tResult; } else - return std::vector(); + return T(); } } } @@ -175,7 +182,8 @@ class ArgumentParser { } template - T get(const char * aArgumentName) { + typename std::enable_if::value == false, T>::type + get(const char * aArgumentName) { std::map>::iterator tIterator = mArgumentMap.find(aArgumentName); if (tIterator != mArgumentMap.end()) { return tIterator->second->get(); @@ -184,12 +192,13 @@ class ArgumentParser { } template - std::vector get_list(const char * aArgumentName) { + typename std::enable_if::value, T>::type + get(const char * aArgumentName) { std::map>::iterator tIterator = mArgumentMap.find(aArgumentName); if (tIterator != mArgumentMap.end()) { - return tIterator->second->get_list(); + return tIterator->second->get_vector(); } - return std::vector(); + return T(); } private: diff --git a/tests/main.cpp b/tests/main.cpp index 1d783c7..7bd8c06 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -27,7 +27,7 @@ int main(int argc, char * argv[]) { auto config_file = program.get("--config"); auto num_iters = program.get("-n"); auto verbose = program.get("-v"); - auto test_inputs = program.get_list("--test_inputs"); + auto test_inputs = program.get>("--test_inputs"); std::cout << config_file << std::endl; std::cout << num_iters << std::endl;