#include <cstdlib>
//////////////////////////////////////////////////////////////////////////////////////
struct Foo
{
};
struct Bar
{
};
//////////////////////////////////////////////////////////////////////////////////////
struct Attribute1
{
static const bool CAN_BE_BUFFERED = true;
};
struct Attribute2
{
static const bool CAN_BE_BUFFERED = false;
};
//////////////////////////////////////////////////////////////////////////////////////
template<typename P>
struct Sequencer
{
template<typename A , bool = A::CAN_BE_BUFFERED>
struct Process;
};
//////////////////////////////////////////////////////////////////////////////////////
template<typename P>
template<typename A>
struct Sequencer<P>::Process<A,true>
{
};
template<typename P>
template<typename A>
struct Sequencer<P>::Process<A,false>
{
};
//////////////////////////////////////////////////////////////////////////////////////
template<>
struct Sequencer<Bar>
{
template<typename A>
struct Process;
};
//////////////////////////////////////////////////////////////////////////////////////
template<typename A>
struct Sequencer<Bar>::Process<A>
{
};
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
Sequencer<Bar> h1;
Sequencer<Foo> h2;
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPGNzdGRsaWI+CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKc3RydWN0IEZvbwp7Cn07CgpzdHJ1Y3QgQmFyCnsKfTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpzdHJ1Y3QgQXR0cmlidXRlMQp7CglzdGF0aWMgY29uc3QgYm9vbCBDQU5fQkVfQlVGRkVSRUQgPSB0cnVlOwp9OwoKc3RydWN0IEF0dHJpYnV0ZTIKewoJc3RhdGljIGNvbnN0IGJvb2wgQ0FOX0JFX0JVRkZFUkVEID0gZmFsc2U7Cn07CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKdGVtcGxhdGU8dHlwZW5hbWUgUD4Kc3RydWN0IFNlcXVlbmNlcgp7Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBBICwgYm9vbCA9IEE6OkNBTl9CRV9CVUZGRVJFRD4KCXN0cnVjdCBQcm9jZXNzOwp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnRlbXBsYXRlPHR5cGVuYW1lIFA+CnRlbXBsYXRlPHR5cGVuYW1lIEE+CnN0cnVjdCBTZXF1ZW5jZXI8UD46OlByb2Nlc3M8QSx0cnVlPgp7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBQPgp0ZW1wbGF0ZTx0eXBlbmFtZSBBPgpzdHJ1Y3QgU2VxdWVuY2VyPFA+OjpQcm9jZXNzPEEsZmFsc2U+CnsKfTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgp0ZW1wbGF0ZTw+CnN0cnVjdCBTZXF1ZW5jZXI8QmFyPgp7CQoJdGVtcGxhdGU8dHlwZW5hbWUgQT4KCXN0cnVjdCBQcm9jZXNzOwp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnRlbXBsYXRlPHR5cGVuYW1lIEE+CnN0cnVjdCBTZXF1ZW5jZXI8QmFyPjo6UHJvY2VzczxBPgp7Cn07CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKaW50IG1haW4oKQp7CglTZXF1ZW5jZXI8QmFyPiBoMTsKCVNlcXVlbmNlcjxGb28+IGgyOwoJCiAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwp9