25
template<unsigned int n>
struct Factorial {
    enum { value = n * Factorial<n-1>::value};
};

template<>
struct Factorial<0> {
    enum {value = 1};
};

int main() {
    std::cout << Factorial<5>::value;
    std::cout << Factorial<10>::value;
}

上記のプログラムは、コンパイル時に階乗値を計算します。coutを使用して実行時ではなく、コンパイル時に階乗値を出力したい。コンパイル時に階乗値を出力するにはどうすればよいですか?

VS2009を使用しています。

ありがとう!

4

4 に答える 4

35

階乗は、コンパイラによって生成されたメッセージに次のように出力できます。

template<int x> struct _;
int main() {
        _<Factorial<10>::value> __;
        return 0;
}

エラーメッセージ:

prog.cpp:14:32:エラー:集計'_ <3628800> __'の型が不完全であり、定義できません_ :: value> __; ^

これがの階乗3628800です10

ideoneでご覧ください:http://ideone.com/094SJz

それで、あなたはこれを探していますか?


編集:

Matthieuは、階乗を印刷し、コンパイルを続行するための巧妙なトリックを求めました。これが1つの試みです。エラーは発生しないため、コンパイルは1つの警告で成功します。

template<int factorial> 
struct _{ operator char() { return factorial + 256; } }; //always overflow
int main() {
        char(_<Factorial<5>::value>());
        return 0;
}

この警告でコンパイルされます:

main.cpp:'_ :: operator char()[with int factorial = 120]'のインスタンス化:main.cpp:16:39:ここから必須main.cpp:13:48:警告:暗黙の定数変換でオーバーフロー[-Woverflow] struct _ {operator char(){階乗+256を返す; }}; //常にオーバーフロー

これがの階乗120です5

ideoneでのデモ:http://coliru.stacked-crooked.com/a/c4d703a670060545

素敵なマクロを書いて、代わりに次のように使用することができます。

#define PRINT_AS_WARNING(constant) char(_<constant>())    

int main() 
{
         PRINT_AS_WARNING(Factorial<5>::value);
         return 0;
}

それは素晴らしく見えます

于 2011-02-12T11:34:48.857 に答える
8

私はTMPの基本を学んでおり、ロジックが正しいことを確認するためにコンパイル時の結果を知りたいと思っています。

その場合、本当に必要なのは静的アサーションです。

static_assert(Factorial<5> ::value ==     120,  "5! should be 120");
static_assert(Factorial<10>::value == 3628800, "10! should be 3628800");

コンパイラがまだサポートしていない場合はstatic_assert、を使用できますBOOST_STATIC_ASSERT

于 2011-02-12T11:38:26.517 に答える
4

手遅れだと思いますが、それでも。

// definition
template<typename T, T N>
struct print_constexpr{
    [[deprecated]]
    print_constexpr(){ }
};

// usage
print_constexpr<unsigned int, Factorial<5>::value> x;

// output
{path to file}: warning: ‘print_constexpr<T, N>::print_constexpr() [with T = unsigned int; T N = 120]’ is deprecated [-Wdeprecated-declarations]
    print_constexpr<unsigned int, Factorial<5>::value> x;
于 2019-02-25T13:21:01.290 に答える
0

標準的な方法は絶対にありません。コンパイラ固有の方法も考えられません。

[[フィラー]]

于 2011-02-12T11:12:47.530 に答える