#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;
}