#include <iostream>

template <typename T>
struct valdef
{
	typedef T value;
};

template <char... C>
struct string
{
	static char const c_str[];
};

template <char... C>
char const string<C...>::c_str[] = { C..., 0 };

template <typename, typename>
struct append;

template <char... C, char... D>
struct append<string<C...>, string<D...>>
	: valdef<string<C..., D...>>
{};

template <char C, unsigned N>
struct make_string_n
	: valdef
	<
		typename append
		<
			typename make_string_n<C, N - 1>::value,
			string<C>
		>::value
	>
{};

template <char C>
struct make_string_n<C, 0>
	: valdef<string<>>
{};

template <char C, unsigned Chars, char F, unsigned Fills>
struct make_rhombus_line
	: valdef
	<
		typename append
		<
			typename append
			<
				typename make_string_n<F, Fills>::value,
				typename make_string_n<C, Chars>::value
			>::value,
			string<'\n'>
		>::value
	>
{};

template <char C, unsigned Chars, char F, unsigned Fills>
struct rhombus
	: valdef
	<
		typename append
		<
			typename make_rhombus_line<C, Chars, F, Fills>::value,
			typename append
			<
				typename rhombus<C + 1, Chars + 2, F, Fills - 1>::value,
				typename make_rhombus_line<C, Chars, F, Fills>::value
			>::value
		>::value
	>
{};

template <char C, unsigned Chars, char F>
struct rhombus<C, Chars, F, 0>
	: valdef<typename make_rhombus_line<C, Chars, F, 0>::value>
{};

template <char C, char F>
struct make_rhombus
	: valdef<typename rhombus<'A', 1, F, C - 'A'>::value>
{};

int main()
{
	std::cout << make_rhombus<'D', ' '>::value::c_str;
}