#include <iostream>
#include <utility>
#include <tuple>
bool validate (std::string s) { return !s.empty(); }
bool validate (const void *p) { return p; }
template <typename Tuple>
bool validate (Tuple param) {
if (validate(std::get<0>(param))) return true;
#ifndef NDEBUG
std::cout << "Invalid: " << std::get<1>(param) << std::endl;
std::get<2>(param)();
#endif
return false;
}
bool validate () { return true; }
template <typename T, typename... Params>
bool validate (T param, Params... params) {
return validate(param) & validate(params...);
}
void foo (std::string appPath, std::string appName) {
bool result
= validate(
std::make_tuple(appPath, "ApplicationPath",
[&](){ appPath = "defaultPath"; }),
std::make_tuple(appName, "ApplicationName",
[&](){ appName = "defaultName"; })
//...
);
if (result) std::cout << "all good!\n";
else std::cout << "bad param!\n";
std::cout << "path:" << appPath << ", name:" << appName << std::endl;
}
int main () {
foo(std::string(), std::string());
foo(std::string(), "world");
foo("Hello", std::string());
foo("Hello", "world");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHR1cGxlPgoKYm9vbCB2YWxpZGF0ZSAoc3RkOjpzdHJpbmcgcykgeyByZXR1cm4gIXMuZW1wdHkoKTsgfQpib29sIHZhbGlkYXRlIChjb25zdCB2b2lkICpwKSB7IHJldHVybiBwOyB9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+CmJvb2wgdmFsaWRhdGUgKFR1cGxlIHBhcmFtKSB7CiAgICBpZiAodmFsaWRhdGUoc3RkOjpnZXQ8MD4ocGFyYW0pKSkgcmV0dXJuIHRydWU7CiAgICAjaWZuZGVmIE5ERUJVRwogICAgc3RkOjpjb3V0IDw8ICJJbnZhbGlkOiAiIDw8IHN0ZDo6Z2V0PDE+KHBhcmFtKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmdldDwyPihwYXJhbSkoKTsKICAgICNlbmRpZgogICAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIHZhbGlkYXRlICgpIHsgcmV0dXJuIHRydWU7IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBQYXJhbXM+CmJvb2wgdmFsaWRhdGUgKFQgcGFyYW0sIFBhcmFtcy4uLiBwYXJhbXMpIHsKICAgIHJldHVybiB2YWxpZGF0ZShwYXJhbSkgJiB2YWxpZGF0ZShwYXJhbXMuLi4pOwp9Cgp2b2lkIGZvbyAoc3RkOjpzdHJpbmcgYXBwUGF0aCwgc3RkOjpzdHJpbmcgYXBwTmFtZSkgewogICAgYm9vbCByZXN1bHQKICAgICAgICA9IHZhbGlkYXRlKAogICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShhcHBQYXRoLCAiQXBwbGljYXRpb25QYXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKCl7IGFwcFBhdGggPSAiZGVmYXVsdFBhdGgiOyB9KSwKICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoYXBwTmFtZSwgIkFwcGxpY2F0aW9uTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXSgpeyBhcHBOYW1lID0gImRlZmF1bHROYW1lIjsgfSkKICAgICAgICAgICAgICAgICAgIC8vLi4uCiAgICAgICAgICAgICAgICAgICk7CiAgICBpZiAocmVzdWx0KSBzdGQ6OmNvdXQgPDwgImFsbCBnb29kIVxuIjsKICAgIGVsc2Ugc3RkOjpjb3V0IDw8ICJiYWQgcGFyYW0hXG4iOwoKICAgIHN0ZDo6Y291dCA8PCAicGF0aDoiIDw8IGFwcFBhdGggPDwgIiwgbmFtZToiIDw8IGFwcE5hbWUgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbiAoKSB7CiAgICAgZm9vKHN0ZDo6c3RyaW5nKCksIHN0ZDo6c3RyaW5nKCkpOwogICAgIGZvbyhzdGQ6OnN0cmluZygpLCAid29ybGQiKTsKICAgICBmb28oIkhlbGxvIiwgc3RkOjpzdHJpbmcoKSk7CiAgICAgZm9vKCJIZWxsbyIsICJ3b3JsZCIpOwp9Cg==