テンプレートを使用せずにC++で汎用プログラミングを行うことができるかどうかを知りたい。テンプレートを使用せずにテンプレートを使用して記述されたC++で利用可能なすべてのライブラリを記述することは可能ですか?テンプレートにC++で利用可能な代替手段はありますか?私が知りたいパワー(C++ - {templates})=パワー(C++)?
はそれは同じ機能
テンプレートを使用せずにC++で汎用プログラミングを行うことができるかどうかを知りたい。テンプレートを使用せずにテンプレートを使用して記述されたC++で利用可能なすべてのライブラリを記述することは可能ですか?テンプレートにC++で利用可能な代替手段はありますか?私が知りたいパワー(C++ - {templates})=パワー(C++)?
はそれは同じ機能
理論的には、テンプレートのないC++はまだTuring-completeなので、その言語のすべての関数のプログラムを書くことができます。このプログラムは、テンプレートを使ってC++で記述することもできます。私の知る限り、C++のマクロプリプロセッサはチューリング完全ではありませんが、テンプレートはあります。したがって、純粋にテンプレートとして実装できる機能は存在しなければなりませんが、マクロでは実装できません。
実際には、私は同じセマンティクスですべてを再実装することはできないと思います。テンプレートがなければ、タイプセーフティを犠牲にして、マクロを使うことに固執しなければならないでしょう。初期のJavaクラスのような継承ベースのアプローチは単純なコンテナライブラリでさえもそうでした。
より高度なメタプログラミングライブラリの場合、 Boost.Spirit Boost.Proto、私はそれらが別の形式のメタプログラミングなしで実装できることは疑いの余地があります。マクロはうまくいくかもしれませんが、これはコードジェネレータのようなもので、コンパイラへの型チェックを延期します。エラーメッセージは、テンプレートを使用するよりもさらに悪くなります。さらに、セマンティクスはパラメータの受け渡しによって異なります。
テンプレートがない複雑なC++プログラムを書くのが何度も徹底的にテストされていないような難しさがあるように、最初の文章は「理論的に」と言われるのはなぜですか?つまり、Cが存在します。 –
私はマクロのようなテンプレートをコードジェネレータの一種であると付け加えたいと思います。 Jensが述べたように、違いは*コードが生成されるときです。前処理vsコンパイル、テキスト操作vs型チェック。テンプレートは優れたコードジェネレータです。 – TobiMcNamobi
@BenjaminLindley私は理論的には計算理論に基づく議論のためだと言った。私は計算の表現力に言及していませんでした、またはこれが有用かどうか、一般的なデータ型は大きな改善だとは思いますが。 – Jens
を私に提供するテンプレートを使用してC++で書かれたライブラリの上に抽象化を書き込むことができるまあ、テンプレートはまさにそれです - テンプレート。実際のタイプと機能の青写真です。したがって、理論的には、これらのテンプレートのインスタンシエーションをすべて手動で行うことができます。しかし、それはもはや汎用プログラミングではないでしょう。質問の
少なくともC++では、テンプレートはそれ以上のものです。彼らはチューリング完全な言語です。 – Jens
回答:
は、テンプレートのC++で利用可能な任意の代替はありますか?
マクロスはテンプレートの代替品です。 (未良い代替が、代替) 関連リンク[1]、[2]
が比較:macrosesの
#define min(i, j) (((i) < (j)) ? (i) : (j))
template<class T> T min (T i, T j) { return ((i < j) ? i : j) }
問題:
:
は、テンプレートを使用せずに、テンプレートを使用して書かれているC++で利用可能なすべてのライブラリを記述することが可能です。
場合によってはマクロを使用することもできます。各ライブラリタイプの実装を記述または生成することができます。しかし、ユーザー定義の型ライブラリの場合、マクロが便利な単純な場合を除いて、実装はできません。 以前の純粋なC(C++以外の)プログラムには、ビルド段階でいくつかの "ソース"テンプレートからソースを生成するために使用されたソースに特別なツールが含まれています。
標準ライブラリのほとんどがテンプレートで構成されているとします。それはあなたが卵なしでスクランブルエッグを作ることができるかどうか尋ねるようなものです。 – juanchopanza
仮に、Javaのアプローチに従って、すべてを汎用の親 'Object'クラスまたは' CObject'クラスのサブクラス/子孫にすることができます。実際には、それは別の話です。 – tinlyx
@tinlyxしかし、それはあなたに同じ機能を与えることはありません。 – juanchopanza