Commit b73d1bd9b23abaa4d01f76578627c7f5cf83aaf9

Authored by Henry Fredrick Schreiner
1 parent aae31265

Trying enable if, new version

Showing 1 changed file with 24 additions and 18 deletions
include/CLI.hpp
@@ -36,6 +36,18 @@ std::string join(const T& v, std::string delim = ",") { @@ -36,6 +36,18 @@ std::string join(const T& v, std::string delim = ",") {
36 36
37 namespace CLI { 37 namespace CLI {
38 38
  39 +// Based generally on https://rmf.io/cxx11/almost-static-if
  40 +namespace detail {
  41 + enum class enabler {};
  42 +}
  43 +constexpr detail::enabler dummy = {};
  44 +
  45 +template <typename Condition>
  46 +using EnableIf = typename std::enable_if<Condition::value, detail::enabler>::type;
  47 +template <typename Condition>
  48 +using DisableIf = typename std::enable_if<!Condition::value, detail::enabler>::type;
  49 +
  50 +
39 struct Combiner { 51 struct Combiner {
40 int num; 52 int num;
41 bool positional; 53 bool positional;
@@ -252,9 +264,8 @@ public: @@ -252,9 +264,8 @@ public:
252 }; 264 };
253 265
254 266
255 -template<typename T>  
256 -typename std::enable_if<std::is_integral<T>::value, bool>::type  
257 -lexical_cast(std::string input, T& output) { 267 +template<typename T, EnableIf<std::is_integral<T>> = dummy>
  268 +bool lexical_cast(std::string input, T& output) {
258 logit("Int lexical cast " + input); 269 logit("Int lexical cast " + input);
259 try{ 270 try{
260 output = (T) std::stoll(input); 271 output = (T) std::stoll(input);
@@ -266,9 +277,8 @@ lexical_cast(std::string input, T&amp; output) { @@ -266,9 +277,8 @@ lexical_cast(std::string input, T&amp; output) {
266 } 277 }
267 } 278 }
268 279
269 -template<typename T>  
270 -typename std::enable_if<std::is_floating_point<T>::value, bool>::type  
271 -lexical_cast(std::string input, T& output) { 280 +template<typename T, EnableIf<std::is_floating_point<T>> = dummy>
  281 +bool lexical_cast(std::string input, T& output) {
272 logit("Floating lexical cast " + input); 282 logit("Floating lexical cast " + input);
273 try{ 283 try{
274 output = (T) std::stold(input); 284 output = (T) std::stold(input);
@@ -281,11 +291,9 @@ lexical_cast(std::string input, T&amp; output) { @@ -281,11 +291,9 @@ lexical_cast(std::string input, T&amp; output) {
281 } 291 }
282 292
283 // String and similar 293 // String and similar
284 -template<typename T>  
285 -typename std::enable_if<  
286 - !std::is_floating_point<T>::value  
287 - && !std::is_integral<T>::value, bool>::type  
288 -lexical_cast(std::string input, T& output) { 294 +template<typename T,
  295 +typename std::enable_if<!std::is_floating_point<T>::value && !std::is_integral<T>::value, detail::enabler>::type = dummy>
  296 +bool lexical_cast(std::string input, T& output) {
289 logit("Direct lexical cast: " + input); 297 logit("Direct lexical cast: " + input);
290 output = input; 298 output = input;
291 return true; 299 return true;
@@ -375,9 +383,8 @@ public: @@ -375,9 +383,8 @@ public:
375 } 383 }
376 384
377 /// Add option for string 385 /// Add option for string
378 - template<typename T>  
379 - typename std::enable_if<!std::is_array<T>::value, void>::type  
380 - add_option( 386 + template<typename T, DisableIf<std::is_array<T>> = dummy>
  387 + void add_option(
381 std::string name, ///< The name, long,short 388 std::string name, ///< The name, long,short
382 T &variable, ///< The variable to set 389 T &variable, ///< The variable to set
383 std::string discription="", ///< Discription string 390 std::string discription="", ///< Discription string
@@ -440,11 +447,10 @@ public: @@ -440,11 +447,10 @@ public:
440 } 447 }
441 448
442 /// Add option for flag 449 /// Add option for flag
443 - template<typename T>  
444 - typename std::enable_if<std::is_integral<T>::value, void>::type  
445 - add_flag( 450 + template<typename T, EnableIf<std::is_integral<T>> = dummy>
  451 + void add_flag(
446 std::string name, ///< The name, short,long 452 std::string name, ///< The name, short,long
447 - T &count, ///< A varaible holding the count 453 + T &count, ///< A varaible holding the count
448 std::string discription="" ///< Discription string 454 std::string discription="" ///< Discription string
449 ) { 455 ) {
450 456