#include template struct CharToStringHolder { const char data[4]; constexpr inline CharToStringHolder() : data({N / 100 + 48, N / 10 + 48, N % 10 + 48, 0}) {} }; template constexpr const char* char_to_string() { return CharToStringHolder().data; } template constexpr const char* fizzbuzz() { return ( ( N % 3 == 0 && N % 5 == 0 ) ? "FizzBuzz" : ( ( N % 3 == 0 ) ? "Fizz" : ( ( N % 5 == 0 ) ? "Buzz" : char_to_string() ))); } template struct CompileTimeArray { static const char* data[sizeof...(args)]; }; template const char* CompileTimeArray::data[sizeof...(args)] = { args... }; template class MetaFunc, const char*... args> struct generate_array_impl { typedef typename generate_array_impl::value, args...>::result result; }; template class MetaFunc, const char*... args> struct generate_array_impl<0, MetaFunc, args...> { typedef CompileTimeArray::value, args...> result; }; template class MetaFunc> struct GenerateArray { typedef typename generate_array_impl::result result; }; template struct FizzBuzzMetaFunc { static const char value[sizeof(fizzbuzz())]; }; template const char FizzBuzzMetaFunc::value[sizeof(fizzbuzz())] = {fizzbuzz()}; int main(void) { const size_t count = 100; typedef typename GenerateArray::result A; for(size_t i = 0; i < count; ++i) { std::cout << A::data[i] << "\n"; } return 0; }