#include <iostream>

template<int, int>
struct G1
{
	G1()
	{ 
		std::cout << "G1\n";
	}
};

template<int, int>
struct G2
{
	G2()
	{ 
		std::cout << "G2\n";
	}
};

template<template<int, int> class T>
struct Foo
{
	T<7, 42> M;
};

template<bool Condition, template<int, int> class T, template<int, int> class U> 
struct Conditional_asfdlol 
{ 
	template<int A, int  B> 
	struct Type : public T<A, B> 
	{ 
	}; 
};

template<bool Condition, template<int, int> class T, template<int, int> class U>
struct Conditional_camper
{
	template<int A, int  B>
	struct Apply
	{
		typedef U<A,B> Type;
	};
};

int main()
{
	Foo<G1> F1;
	Foo<G2> F2;
	
	Foo<Conditional_asfdlol<true, G1, G2>::Type> F3;
	Foo<Conditional_camper<false, G1, G2>::Apply> F4; // Nicht das gewünschte Ergebnis
}