#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 result : 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 result<arg>
{};
int main()
{
std::cout << std::boolalpha << std::is_same<plus1<Int<100>>::result, Int<101>>::value;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgSWRlbnRpdHkKewogICAgICAgIHR5cGVkZWYgVCByZXN1bHQ7Cn07CiAKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFQgdj4Kc3RydWN0IENvbnN0YW50CnsKICAgICAgICB0eXBlZGVmIFQgdHlwZTsKICAgICAgICBzdGF0aWMgY29uc3RleHByIFQgdmFsdWUgPSB2Owp9OwogCnRlbXBsYXRlIDxpbnQgTj4KdXNpbmcgSW50ID0gQ29uc3RhbnQ8aW50LCBOPjsKIAp0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWUuLi4+IGNsYXNzIGZ1bmN0aW9uLCB0eXBlbmFtZSBhcmcyPgpzdHJ1Y3QgYmluZDJuZAp7CiAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzEsIHR5cGVuYW1lLi4uIGFyZ3M+CiAgICAgICAgc3RydWN0IHJlc3VsdCA6IGZ1bmN0aW9uPGFyZzEsIGFyZzIsIGFyZ3MuLi4+CiAgICAgICAge307Cn07CiAKdGVtcGxhdGUgPHR5cGVuYW1lIGxlZnQsIHR5cGVuYW1lIHJpZ2h0PgpzdHJ1Y3QgcGx1cyA6IElkZW50aXR5PENvbnN0YW50PGRlY2x0eXBlKGxlZnQ6OnZhbHVlICsgcmlnaHQ6OnZhbHVlKSwgbGVmdDo6dmFsdWUgKyByaWdodDo6dmFsdWU+Pgp7fTsKIAp0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnPgpzdHJ1Y3QgcGx1czEgOiBiaW5kMm5kPHBsdXMsIEludDwxPj46OnRlbXBsYXRlIHJlc3VsdDxhcmc+Cnt9OwogCmludCBtYWluKCkKewogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmJvb2xhbHBoYSA8PCBzdGQ6OmlzX3NhbWU8cGx1czE8SW50PDEwMD4+OjpyZXN1bHQsIEludDwxMDE+Pjo6dmFsdWU7Cn0=