#include <iostream>
class nullparam
{};
template <class T, T Default>
class default_param
{
public:
default_param (const nullparam&)
: _value (Default)
{}
default_param (const T& val)
: _value (val)
{}
default_param (T&& val)
: _value (std::forward <T> (val))
{}
const T& get () const
{
return _value;
}
private:
T _value;
};
void foo (default_param<int, 10> p1, default_param <short, 22> p2, default_param <char, 'H'> p3)
{
std::cout << p1.get () << ' ' << p2.get() << ' ' << p3.get() << std::endl;
}
int main() {
foo (nullparam(), nullparam(), 'G');
foo (155, nullparam(), nullparam());
foo (nullparam(), 122, nullparam());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgbnVsbHBhcmFtCnt9OwoKdGVtcGxhdGUgPGNsYXNzIFQsIFQgRGVmYXVsdD4KY2xhc3MgZGVmYXVsdF9wYXJhbQp7CnB1YmxpYzoKCWRlZmF1bHRfcGFyYW0gKGNvbnN0IG51bGxwYXJhbSYpCgkJOglfdmFsdWUgKERlZmF1bHQpCgl7fQoJCglkZWZhdWx0X3BhcmFtIChjb25zdCBUJiB2YWwpCgkJOglfdmFsdWUgKHZhbCkKCXt9CgkKCWRlZmF1bHRfcGFyYW0gKFQmJiB2YWwpCgkJOglfdmFsdWUgKHN0ZDo6Zm9yd2FyZCA8VD4gKHZhbCkpCgl7fQoJCgljb25zdCBUJiBnZXQgKCkgY29uc3QKCXsKCQlyZXR1cm4gX3ZhbHVlOwkJCgl9Cgpwcml2YXRlOgoJVCBfdmFsdWU7Cn07CgoKdm9pZCBmb28gKGRlZmF1bHRfcGFyYW08aW50LCAxMD4gcDEsIGRlZmF1bHRfcGFyYW0gPHNob3J0LCAyMj4gcDIsIGRlZmF1bHRfcGFyYW0gPGNoYXIsICdIJz4gcDMpCnsKCXN0ZDo6Y291dCA8PCBwMS5nZXQgKCkgPDwgJyAnIDw8IHAyLmdldCgpIDw8ICcgJyA8PCBwMy5nZXQoKSA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkgewoJCglmb28gKG51bGxwYXJhbSgpLCBudWxscGFyYW0oKSwgJ0cnKTsKCWZvbyAoMTU1LCBudWxscGFyYW0oKSwgbnVsbHBhcmFtKCkpOwoJZm9vIChudWxscGFyYW0oKSwgMTIyLCBudWxscGFyYW0oKSk7CgkKCXJldHVybiAwOwp9