fork(1) download
  1. #include <iostream>
  2. #include <utility>
  3. #include <tuple>
  4.  
  5. bool validate (std::string s) { return !s.empty(); }
  6. bool validate (const void *p) { return p; }
  7.  
  8. template <typename Tuple>
  9. bool validate (Tuple param) {
  10. if (validate(std::get<0>(param))) return true;
  11. #ifndef NDEBUG
  12. std::cout << "Invalid: " << std::get<1>(param) << std::endl;
  13. std::get<2>(param)();
  14. #endif
  15. return false;
  16. }
  17.  
  18. bool validate () { return true; }
  19.  
  20. template <typename T, typename... Params>
  21. bool validate (T param, Params... params) {
  22. return validate(param) & validate(params...);
  23. }
  24.  
  25. void foo (std::string appPath, std::string appName) {
  26. bool result
  27. = validate(
  28. std::make_tuple(appPath, "ApplicationPath",
  29. [&](){ appPath = "defaultPath"; }),
  30. std::make_tuple(appName, "ApplicationName",
  31. [&](){ appName = "defaultName"; })
  32. //...
  33. );
  34. if (result) std::cout << "all good!\n";
  35. else std::cout << "bad param!\n";
  36.  
  37. std::cout << "path:" << appPath << ", name:" << appName << std::endl;
  38. }
  39.  
  40. int main () {
  41. foo(std::string(), std::string());
  42. foo(std::string(), "world");
  43. foo("Hello", std::string());
  44. foo("Hello", "world");
  45. }
  46.  
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
Invalid: ApplicationPath
Invalid: ApplicationName
bad param!
path:defaultPath, name:defaultName
Invalid: ApplicationPath
bad param!
path:defaultPath, name:world
Invalid: ApplicationName
bad param!
path:Hello, name:defaultName
all good!
path:Hello, name:world