Created
May 27, 2015 12:27
-
-
Save tatsuhiro-t/2f2fe4674b573fb0a042 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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