#include <type_traits>
#include <iostream>
// Operators are valid.
template < int I>
std:: enable_if_t < ( I > 0 ) && ( I < 5 ) && ! ( I % 2 ) , void >
func( ) {
std:: cout << "Template parameter is small, positive, and even: " << I << '\n ' ;
}
template < int I>
std:: enable_if_t < I && ( I < 5 ) && ! ( ( I > 0 ) && ! ( I % 2 ) ) , void >
func( ) { std:: cout << "I'm Batman.\n " ; }
template < int I>
std:: enable_if_t < I >= 5 && I ! = 7 , void >
func( ) { std:: cout << "Flyin' high\n " ; }
// We can do this, too.
template < int I>
std:: enable_if_t < ! I, void >
func( ) { std:: cout << "Silence will fall.\n " ; }
template < int I>
std:: enable_if_t < I == 7 , void >
func( ) { std:: cout << "...And we're done.\n " ; }
template < int I>
struct Caller : public Caller< I - 1 > {
Caller( ) { func< I> ( ) ; }
} ;
template <>
struct Caller< 0 > {
Caller( ) { func< 0 > ( ) ; }
} ;
int main( ) {
Caller< ( 7 || 0 ) + 6 > { } ; // Syntactic salt for Caller<7>{}.
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+CgovLyBPcGVyYXRvcnMgYXJlIHZhbGlkLgp0ZW1wbGF0ZTxpbnQgST4Kc3RkOjplbmFibGVfaWZfdDwoSSA+IDApICYmIChJIDwgNSkgJiYgIShJICUgMiksIHZvaWQ+CmZ1bmMoKSB7CglzdGQ6OmNvdXQgPDwgIlRlbXBsYXRlIHBhcmFtZXRlciBpcyBzbWFsbCwgcG9zaXRpdmUsIGFuZCBldmVuOiAiIDw8IEkgPDwgJ1xuJzsKfQoKdGVtcGxhdGU8aW50IEk+CnN0ZDo6ZW5hYmxlX2lmX3Q8SSAmJiAoSSA8IDUpICYmICEoKEkgPiAwKSAmJiAhKEkgJSAyKSksIHZvaWQ+CmZ1bmMoKSB7IHN0ZDo6Y291dCA8PCAiSSdtIEJhdG1hbi5cbiI7IH0KCnRlbXBsYXRlPGludCBJPgpzdGQ6OmVuYWJsZV9pZl90PEkgPj0gNSAmJiBJICE9IDcsIHZvaWQ+CmZ1bmMoKSB7IHN0ZDo6Y291dCA8PCAiRmx5aW4nIGhpZ2hcbiI7IH0KCi8vIFdlIGNhbiBkbyB0aGlzLCB0b28uCnRlbXBsYXRlPGludCBJPgpzdGQ6OmVuYWJsZV9pZl90PCFJLCB2b2lkPgpmdW5jKCkgeyBzdGQ6OmNvdXQgPDwgIlNpbGVuY2Ugd2lsbCBmYWxsLlxuIjsgfQoKdGVtcGxhdGU8aW50IEk+CnN0ZDo6ZW5hYmxlX2lmX3Q8SSA9PSA3LCB2b2lkPgpmdW5jKCkgeyBzdGQ6OmNvdXQgPDwgIi4uLkFuZCB3ZSdyZSBkb25lLlxuIjsgfQoKdGVtcGxhdGU8aW50IEk+CnN0cnVjdCBDYWxsZXIgOiBwdWJsaWMgQ2FsbGVyPEkgLSAxPiB7CiAgICBDYWxsZXIoKSB7IGZ1bmM8ST4oKTsgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgQ2FsbGVyPDA+IHsKICAgIENhbGxlcigpIHsgZnVuYzwwPigpOyB9Cn07CgppbnQgbWFpbigpIHsKICAgIENhbGxlcjwoNyB8fCAwKSArIDY+e307IC8vIFN5bnRhY3RpYyBzYWx0IGZvciBDYWxsZXI8Nz57fS4KfQ==