#include <iostream>
#include <iomanip>
#include <type_traits>
template <typename T>
struct Identity
{
typedef T result;
};
template <typename T, T v>
struct Constant
{
typedef T type;
static constexpr T value = v;
};
template <int N>
using Int = Constant<int, N>;
template <template <typename, typename, typename...> class function, typename arg2>
struct bind2nd
{
template <typename arg1, typename... args>
struct binder : function<arg1, arg2, args...>
{};
};
template <typename left, typename right>
struct plus : Identity<Constant<decltype(left::value + right::value), left::value + right::value>>
{};
template <typename arg>
struct plus1 : bind2nd<plus, Int<1>>::template binder<arg>
{};
int main()
{
std::cout << std::boolalpha << std::is_same<plus1<Int<100>>::result, Int<101>>::value;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBJZGVudGl0eQp7Cgl0eXBlZGVmIFQgcmVzdWx0Owp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFQgdj4Kc3RydWN0IENvbnN0YW50CnsKCXR5cGVkZWYgVCB0eXBlOwoJc3RhdGljIGNvbnN0ZXhwciBUIHZhbHVlID0gdjsKfTsKCnRlbXBsYXRlIDxpbnQgTj4KdXNpbmcgSW50ID0gQ29uc3RhbnQ8aW50LCBOPjsKCnRlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZS4uLj4gY2xhc3MgZnVuY3Rpb24sIHR5cGVuYW1lIGFyZzI+CnN0cnVjdCBiaW5kMm5kCnsKCXRlbXBsYXRlIDx0eXBlbmFtZSBhcmcxLCB0eXBlbmFtZS4uLiBhcmdzPgoJc3RydWN0IGJpbmRlciA6IGZ1bmN0aW9uPGFyZzEsIGFyZzIsIGFyZ3MuLi4+Cgl7fTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBsZWZ0LCB0eXBlbmFtZSByaWdodD4Kc3RydWN0IHBsdXMgOiBJZGVudGl0eTxDb25zdGFudDxkZWNsdHlwZShsZWZ0Ojp2YWx1ZSArIHJpZ2h0Ojp2YWx1ZSksIGxlZnQ6OnZhbHVlICsgcmlnaHQ6OnZhbHVlPj4Ke307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnPgpzdHJ1Y3QgcGx1czEgOiBiaW5kMm5kPHBsdXMsIEludDwxPj46OnRlbXBsYXRlIGJpbmRlcjxhcmc+Cnt9OwoKaW50IG1haW4oKQp7CglzdGQ6OmNvdXQgPDwgc3RkOjpib29sYWxwaGEgPDwgc3RkOjppc19zYW1lPHBsdXMxPEludDwxMDA+Pjo6cmVzdWx0LCBJbnQ8MTAxPj46OnZhbHVlOwp9