興味深い問題なので、このコンパイル時の int を文字列 "function" に書きました。macors ではこれを行うことができないことに注意してください。constexpr (C++11、gcc 4.7 でテスト済み) とテンプレートを使用して実行しました。
typedef unsigned int uint;
// number of decimal digits in a number
constexpr int length(uint num) {
return num ? (length(num / 10) + 1) : 0;
}
uint constexpr decShift(uint num, int n) {
return n <= 0 ? num : decShift(num/10, n-1);
}
// return '\0' or the nth decimal digit of num
char constexpr intChar(uint num, int index) {
return index < 0 ? 0 : ( (decShift(num, index) % 10) + '0' );
}
// templated short array of char containing the digits
template<uint num> struct intToStr {
static constexpr uint n = length(num);
static constexpr char value[16] = {
intChar(num, n - 1),
intChar(num, n - 2),
intChar(num, n - 3),
intChar(num, n - 4),
intChar(num, n - 5),
intChar(num, n - 6),
intChar(num, n - 7),
intChar(num, n - 8),
intChar(num, n - 9),
intChar(num, n - 10),
intChar(num, n - 11),
intChar(num, n - 12),
intChar(num, n - 13),
intChar(num, n - 14),
intChar(num, n - 15),
0
};
};
template<uint num> constexpr char intToStr<num>::value[16];
// test with sizeof
int main() {
char array[1357];
std::cout << intToStr<sizeof(array)>::value << std::endl;
}