#include <iostream>
#include <array>

using namespace std;

typedef size_t Data;

class MyFunction
{
private:
	static const std::array<std::string, 3> values;
public:
	template<size_t N>
	static void Func(const Data& aData)
	{
		size_t index = (N > aData ? 2 : (N == aData ? 1 : 0) );
		cout << "Function::Func<"<< N << ">:\t" << N << values[index] << aData << endl;
	}

	typedef decltype(&Func<0>) type;	
};

const std::array<std::string, 3> MyFunction::values {"<", "=", ">"};

template<class Function, size_t N>
class FunctionManager
{
private:
	static const typename Function::type func_;

	static constexpr typename Function::type Create()
	{
		return &Function::Func<N>;
	}
public:	
	void operator()(const Data &aData) const
	{
		func_(aData);
	}
};

template<class Function, size_t N>
const typename Function::type FunctionManager<Function, N>::func_ = FunctionManager<Function, N>::Create();

int main()
{
	static const size_t N = 6;
	auto man = FunctionManager<MyFunction, N>();
	man(N/2);
	return 0;
}