Using enable_if and template specializations to deal with parser.get<vector<T>>(..)

This commit is contained in:
Pranav Srinivas Kumar 2019-03-30 13:47:59 -04:00
parent 16e3f58ce9
commit 717e6aafdb
2 changed files with 22 additions and 13 deletions

View File

@ -4,9 +4,16 @@
#include <functional>
#include <any>
#include <memory>
#include <type_traits> // C++0x
namespace argparse {
template<typename Test, template<typename...> class Ref>
struct is_specialization : std::false_type {};
template<template<typename...> class Ref, typename... Args>
struct is_specialization<Ref<Args...>, Ref> : std::true_type {};
template <class KeyType, class ElementType>
bool upsert(std::map<KeyType, ElementType>& aMap, KeyType const& aKey, ElementType const& aNewValue) {
typedef typename std::map<KeyType, ElementType>::iterator Iterator;
@ -84,24 +91,24 @@ struct Argument {
}
template <typename T>
std::vector<T> get_list() {
std::vector<T> tResult;
T get_vector() {
T tResult;
if (mValues.size() == 0) {
if (mDefaultValue != nullptr) {
std::any tDefaultValueLambdaResult = mDefaultValue();
std::vector<T> tDefaultValues = std::any_cast<std::vector<T>>(tDefaultValueLambdaResult);
T tDefaultValues = std::any_cast<T>(tDefaultValueLambdaResult);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<T>(tDefaultValues[i]));
tResult.push_back(std::any_cast<typename T::value_type>(tDefaultValues[i]));
}
return tResult;
}
else
return std::vector<T>();
return T();
}
else {
if (mRawValues.size() > 0) {
for (size_t i = 0; i < mValues.size(); i++) {
tResult.push_back(std::any_cast<T>(mValues[i]));
tResult.push_back(std::any_cast<typename T::value_type>(mValues[i]));
}
return tResult;
}
@ -110,12 +117,12 @@ struct Argument {
std::any tDefaultValueLambdaResult = mDefaultValue();
std::vector<T> tDefaultValues = std::any_cast<std::vector<T>>(tDefaultValueLambdaResult);
for (size_t i = 0; i < tDefaultValues.size(); i++) {
tResult.push_back(std::any_cast<T>(tDefaultValues[i]));
tResult.push_back(std::any_cast<typename T::value_type>(tDefaultValues[i]));
}
return tResult;
}
else
return std::vector<T>();
return T();
}
}
}
@ -175,7 +182,8 @@ class ArgumentParser {
}
template <typename T = std::string>
T get(const char * aArgumentName) {
typename std::enable_if<is_specialization<T, std::vector>::value == false, T>::type
get(const char * aArgumentName) {
std::map<std::string, std::shared_ptr<Argument>>::iterator tIterator = mArgumentMap.find(aArgumentName);
if (tIterator != mArgumentMap.end()) {
return tIterator->second->get<T>();
@ -184,12 +192,13 @@ class ArgumentParser {
}
template <typename T>
std::vector<T> get_list(const char * aArgumentName) {
typename std::enable_if<is_specialization<T, std::vector>::value, T>::type
get(const char * aArgumentName) {
std::map<std::string, std::shared_ptr<Argument>>::iterator tIterator = mArgumentMap.find(aArgumentName);
if (tIterator != mArgumentMap.end()) {
return tIterator->second->get_list<T>();
return tIterator->second->get_vector<T>();
}
return std::vector<T>();
return T();
}
private:

View File

@ -27,7 +27,7 @@ int main(int argc, char * argv[]) {
auto config_file = program.get<std::string>("--config");
auto num_iters = program.get<int>("-n");
auto verbose = program.get<bool>("-v");
auto test_inputs = program.get_list<int>("--test_inputs");
auto test_inputs = program.get<std::vector<int>>("--test_inputs");
std::cout << config_file << std::endl;
std::cout << num_iters << std::endl;