#include <type_traits>
template<typename T>
struct identity
{
using type = T;
};
template<template<typename...> class F , typename... ARGS>
struct lazy
{};
namespace impl
{
template<typename L , typename... ARGS>
struct lazy_instance;
template<template<typename...> class F , typename... ARGS , typename... IARGS>
struct lazy_instance<lazy<F,ARGS...>,IARGS...> : public identity<F<ARGS...>>
{};
}
template<typename L , typename... ARGS>
using lazy_instance = typename impl::lazy_instance<L,ARGS...>::type;
template<typename T>
struct foo
{
static_assert( sizeof(T) != sizeof(T) , "ERROR, USE INT" );
};
template<>
struct foo<int>
{};
using ok = lazy_instance<typename std::conditional<false,
lazy<foo,int>,
lazy<foo,bool>
>::type
>;
static_assert( std::is_same<ok,foo<bool>>::value , "Mmmmm..." );
int main(){}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGlkZW50aXR5CnsKCXVzaW5nIHR5cGUgPSBUOwkKfTsKCnRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcyBGICwgdHlwZW5hbWUuLi4gQVJHUz4Kc3RydWN0IGxhenkKe307CgpuYW1lc3BhY2UgaW1wbAp7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMICwgdHlwZW5hbWUuLi4gQVJHUz4KICAgIHN0cnVjdCBsYXp5X2luc3RhbmNlOwoKICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcyBGICwgdHlwZW5hbWUuLi4gQVJHUyAsIHR5cGVuYW1lLi4uIElBUkdTPgogICAgc3RydWN0IGxhenlfaW5zdGFuY2U8bGF6eTxGLEFSR1MuLi4+LElBUkdTLi4uPiA6IHB1YmxpYyBpZGVudGl0eTxGPEFSR1MuLi4+PgogICAge307Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIEwgLCB0eXBlbmFtZS4uLiBBUkdTPgp1c2luZyBsYXp5X2luc3RhbmNlID0gdHlwZW5hbWUgaW1wbDo6bGF6eV9pbnN0YW5jZTxMLEFSR1MuLi4+Ojp0eXBlOwoKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgZm9vCnsKCXN0YXRpY19hc3NlcnQoIHNpemVvZihUKSAhPSBzaXplb2YoVCkgLCAiRVJST1IsIFVTRSBJTlQiICk7Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBmb288aW50Pgp7fTsKCgp1c2luZyBvayA9IGxhenlfaW5zdGFuY2U8dHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eTxmb28saW50PiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eTxmb28sYm9vbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgID47CgpzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3NhbWU8b2ssZm9vPGJvb2w+Pjo6dmFsdWUgLCAiTW1tbW0uLi4iICk7CgppbnQgbWFpbigpe30=