Skip to content

Instantly share code, notes, and snippets.

@tatsuhiro-t
Created May 27, 2015 12:27
Show Gist options
  • Save tatsuhiro-t/2f2fe4674b573fb0a042 to your computer and use it in GitHub Desktop.
Save tatsuhiro-t/2f2fe4674b573fb0a042 to your computer and use it in GitHub Desktop.
#include <string>
#include <array>
#include <iostream>
// compile-time string from
// http://blog.biicode.com/template-metaprogramming-cpp-ii/
template <char... C> struct String {
static constexpr std::array<char, sizeof...(C)+1> data = {{C..., '\0'}};
constexpr operator const char *() const { return data.data(); }
};
template <char... C>
constexpr std::array<char, sizeof...(C)+1> String<C...>::data;
constexpr char digit(int n) { return '0' + n; }
template <int want> struct Builder {
template <int d, int p, int sum, int sign, typename Ans, typename Acc>
struct BuilderImpl;
template <int d, int p, int sum, int sign, char... Ans, char... Acc>
struct BuilderImpl<d, p, sum, sign, String<Ans...>, String<Acc...>> {
using result = typename BuilderImpl<
d + 1, p * 10 + d, sum, sign, String<Ans..., digit(d)>,
typename BuilderImpl<
d + 1, 0, sum + sign *(p * 10 + d), -1,
String<Ans..., digit(d), '-'>,
typename BuilderImpl<d + 1, 0, sum + sign *(p * 10 + d), 1,
String<Ans..., digit(d), '+'>,
String<Acc...>>::result>::result>::result;
};
template <int sum, typename Ans, typename Acc> struct Check;
template <int sum, char... Ans, char... Acc>
struct Check<sum, String<Ans...>, String<Acc...>> {
using result = String<Acc...>;
};
template <char... Ans, char... Acc>
struct Check<want, String<Ans...>, String<Acc...>> {
using result = String<Acc..., Ans..., '\n'>;
};
template <int p, int sum, int sign, char... Ans, char... Acc>
struct BuilderImpl<9, p, sum, sign, String<Ans...>, String<Acc...>> {
using result = typename Check<sum + sign *(p * 10 + 9), String<Ans..., '9'>,
String<Acc...>>::result;
};
using result = typename BuilderImpl<1, 0, 0, 1, String<>, String<>>::result;
};
int main() { std::cout << Builder<100>::result(); }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment