1. ホーム
  2. c++

[解決済み] C++のテンプレートはチューリングコンプリートか?

2022-08-16 18:10:27

質問

C++のテンプレートシステムは、コンパイル時にチューリング完全であると聞いています。このことは この投稿 で、また ウィキペディア .

この性質を利用した計算の自明でない例を提示してください。

この事実は実際に有用ですか?

どのように解決するのですか?

#include <iostream>

template <int N> struct Factorial
{
    enum { val = Factorial<N-1>::val * N };
};

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

int main()
{
    // Note this value is generated at compile time.
    // Also note that most compilers have a limit on the depth of the recursion available.
    std::cout << Factorial<4>::val << "\n";
}

ちょっと面白かったけど、あまり実用的じゃないね。

質問の後半にお答えします。

この事実は実際に役に立つのでしょうか?

短い答えです。多少は。

長い答え はい、ただし、あなたがテンプレートデーモンである場合に限ります。

他の人が使うのに本当に役に立つテンプレートメタ・プログラミング(つまりライブラリ)を使って良いプログラミングを生み出すことは、(可能ではありますが)本当に大変なことです。ブーストを助けるために、さらに MPL というメタ・プログラミング・ライブラリがあります。しかし、テンプレートコードのコンパイラーエラーをデバッグしようとすると、長い間大変な思いをすることになります。

しかし、何か役に立つことに使われている良い実用例があります。

Scott Meyers はテンプレート機能を使用して C++ 言語 (私はこの用語を大まかに使用しています) の拡張を行なっています。彼の仕事については、ここで読むことができます。 コードの機能を強制する '