#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCB2YWxkZWYKewoJdHlwZWRlZiBUIHZhbHVlOwp9OwoKdGVtcGxhdGUgPGNoYXIuLi4gQz4Kc3RydWN0IHN0cmluZwp7CglzdGF0aWMgY2hhciBjb25zdCBjX3N0cltdOwp9OwoKdGVtcGxhdGUgPGNoYXIuLi4gQz4KY2hhciBjb25zdCBzdHJpbmc8Qy4uLj46OmNfc3RyW10gPSB7IEMuLi4sIDAgfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWU+CnN0cnVjdCBhcHBlbmQ7Cgp0ZW1wbGF0ZSA8Y2hhci4uLiBDLCBjaGFyLi4uIEQ+CnN0cnVjdCBhcHBlbmQ8c3RyaW5nPEMuLi4+LCBzdHJpbmc8RC4uLj4+Cgk6IHZhbGRlZjxzdHJpbmc8Qy4uLiwgRC4uLj4+Cnt9OwoKdGVtcGxhdGUgPGNoYXIgQywgdW5zaWduZWQgTj4Kc3RydWN0IG1ha2Vfc3RyaW5nX24KCTogdmFsZGVmCgk8CgkJdHlwZW5hbWUgYXBwZW5kCgkJPAoJCQl0eXBlbmFtZSBtYWtlX3N0cmluZ19uPEMsIE4gLSAxPjo6dmFsdWUsCgkJCXN0cmluZzxDPgoJCT46OnZhbHVlCgk+Cnt9OwoKdGVtcGxhdGUgPGNoYXIgQz4Kc3RydWN0IG1ha2Vfc3RyaW5nX248QywgMD4KCTogdmFsZGVmPHN0cmluZzw+Pgp7fTsKCnRlbXBsYXRlIDxjaGFyIEMsIHVuc2lnbmVkIENoYXJzLCBjaGFyIEYsIHVuc2lnbmVkIEZpbGxzPgpzdHJ1Y3QgbWFrZV9yaG9tYnVzX2xpbmUKCTogdmFsZGVmCgk8CgkJdHlwZW5hbWUgYXBwZW5kCgkJPAoJCQl0eXBlbmFtZSBhcHBlbmQKCQkJPAoJCQkJdHlwZW5hbWUgbWFrZV9zdHJpbmdfbjxGLCBGaWxscz46OnZhbHVlLAoJCQkJdHlwZW5hbWUgbWFrZV9zdHJpbmdfbjxDLCBDaGFycz46OnZhbHVlCgkJCT46OnZhbHVlLAoJCQlzdHJpbmc8J1xuJz4KCQk+Ojp2YWx1ZQoJPgp7fTsKCnRlbXBsYXRlIDxjaGFyIEMsIHVuc2lnbmVkIENoYXJzLCBjaGFyIEYsIHVuc2lnbmVkIEZpbGxzPgpzdHJ1Y3QgcmhvbWJ1cwoJOiB2YWxkZWYKCTwKCQl0eXBlbmFtZSBhcHBlbmQKCQk8CgkJCXR5cGVuYW1lIG1ha2VfcmhvbWJ1c19saW5lPEMsIENoYXJzLCBGLCBGaWxscz46OnZhbHVlLAoJCQl0eXBlbmFtZSBhcHBlbmQKCQkJPAoJCQkJdHlwZW5hbWUgcmhvbWJ1czxDICsgMSwgQ2hhcnMgKyAyLCBGLCBGaWxscyAtIDE+Ojp2YWx1ZSwKCQkJCXR5cGVuYW1lIG1ha2VfcmhvbWJ1c19saW5lPEMsIENoYXJzLCBGLCBGaWxscz46OnZhbHVlCgkJCT46OnZhbHVlCgkJPjo6dmFsdWUKCT4Ke307Cgp0ZW1wbGF0ZSA8Y2hhciBDLCB1bnNpZ25lZCBDaGFycywgY2hhciBGPgpzdHJ1Y3QgcmhvbWJ1czxDLCBDaGFycywgRiwgMD4KCTogdmFsZGVmPHR5cGVuYW1lIG1ha2VfcmhvbWJ1c19saW5lPEMsIENoYXJzLCBGLCAwPjo6dmFsdWU+Cnt9OwoKdGVtcGxhdGUgPGNoYXIgQywgY2hhciBGPgpzdHJ1Y3QgbWFrZV9yaG9tYnVzCgk6IHZhbGRlZjx0eXBlbmFtZSByaG9tYnVzPCdBJywgMSwgRiwgQyAtICdBJz46OnZhbHVlPgp7fTsKCmludCBtYWluKCkKewoJc3RkOjpjb3V0IDw8IG1ha2VfcmhvbWJ1czwnRCcsICcgJz46OnZhbHVlOjpjX3N0cjsKfQ==