コンパイル時に文字列リテラルに指定のアルゴリズムによる計算を施し、整数に変換するには?

頭の体操です。

int main(void) {
  return CompileTimeHash("abcdefghijklmnopqrstu");
}

が、

mov $12345, %eax

のような形にコンパイルされればOKとします(最適化をかけて即値になればOK)。テンプレートの再帰を使うことになると思いますが、再帰がunrollされただけの形は当然NG、マクロの使用もNGとします。


.....答えは!

#include <cstddef>

template <std::size_t N>
inline int accum(const char (&str)[N]) {
    return str[N - 1] + accum(reinterpret_cast<const char (&)[N-1]>(str));
}

template<>
inline int accum<1>(const char (&str)[1]) {
    return str[0];
}

int main(void) {
    return accum("abcdefg1234567");
}

テンプレートの再帰と特殊化はともかく、reinterpret_castは知っていないとちょっと思いつかないかもしれませんね。2chより。