#include <iostream>
#include <type_traits>
template <int I, class T>
using enableIf = typename std::enable_if<I, T>::type;
template <class T>
struct optional{
template <class U>
enableIf<std::is_convertible<U, T>::value, T> value_or(U&& v) const{
std::cout << "value_or(U&& v)\n";
return std::move(v);
}
template <class F>
auto value_or(F&& action) const -> decltype(action()) {
return action();
}
};
int main() {
optional<int> o1;
o1.value_or(1);
int i;
o1.value_or(i);
o1.value_or([](){ std::cout<< "lambda\n"; return 0; });
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8aW50IEksIGNsYXNzIFQ+CnVzaW5nIGVuYWJsZUlmID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SSwgVD46OnR5cGU7CiAgCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3Qgb3B0aW9uYWx7CiAgdGVtcGxhdGUgPGNsYXNzIFU+CiAgZW5hYmxlSWY8c3RkOjppc19jb252ZXJ0aWJsZTxVLCBUPjo6dmFsdWUsIFQ+IHZhbHVlX29yKFUmJiB2KSBjb25zdHsKICAJc3RkOjpjb3V0IDw8ICJ2YWx1ZV9vcihVJiYgdilcbiI7CiAgCXJldHVybiBzdGQ6Om1vdmUodik7CiAgfQogIAogIHRlbXBsYXRlIDxjbGFzcyBGPgogIGF1dG8gdmFsdWVfb3IoRiYmIGFjdGlvbikgY29uc3QgLT4gZGVjbHR5cGUoYWN0aW9uKCkpIHsKICAJcmV0dXJuIGFjdGlvbigpOwogIH0KfTsKCmludCBtYWluKCkgewoJb3B0aW9uYWw8aW50PiBvMTsKCW8xLnZhbHVlX29yKDEpOwoJaW50IGk7CglvMS52YWx1ZV9vcihpKTsKCW8xLnZhbHVlX29yKFtdKCl7IHN0ZDo6Y291dDw8ICJsYW1iZGFcbiI7IHJldHVybiAwOyB9KTsKCXJldHVybiAwOwp9