4

これは私が以前に尋ねたものとはまったく異なる質問であるため、これを投稿しています。

私のトピックは、「なぜ」と「どのように」を説明する答えを生み出す主観的な質問であると定義したいと思います. これは、ヘルプ センターの規則に従って許可されています。

私の質問をより建設的にするために、私のトピックをよりよく説明するリソースを提供します。

質問の下のC++ SuperFAQから

「仮想関数 (動的バインディング、動的ポリモーフィズム) とテンプレート (静的ポリモーフィズム) が大きな違いを生む簡単な理由を教えてください。」

著者は次のように述べています。オブジェクト ファイルと、曾曾祖父が書いたソース コードだけが 25 年前に失われたとしても、その古代のオブジェクト ファイルは何もせずに新しい拡張子を呼び出します。バラバラ。"

彼は続けて、「それが拡張性であり、強力な再利用可能な抽象化のための OO とジェネリック プログラミングです」と述べています。

さらに、私は最近、C++ の作成者である Bjarne Stroustrup によって書かれた論文「なぜ C++ は単なるオブジェクト指向プログラミング言語ではないのか」を読みました。彼の論文では、言語または技術がオブジェクト指向であると定義するのは、それが次のことを直接サポートしている場合に限られます。

  1. 抽象化 – 何らかの形式のクラスとオブジェクトを提供します。

  2. 継承 - 既存のものから新しい抽象化を構築する機能を提供します。

  3. ランタイム ポリモーフィズム – 何らかの形式のランタイム バインディングを提供します。

また、ジェネリック プログラミングについても簡単に言及しています。

6.7 ジェネリック プログラミング - 過去数年間の C++ コミュニティの主要なテーマは、テンプレート メカニズムを活用する技術の開発でした。

これら 2 つのリソースを読むと、オブジェクト指向のパラダイムによって古いコードが新しいコードを使用できることがわかります。ただし、ジェネリック プログラミングは静的バインディングを使用するため、ジェネリック プログラミング (この場合はテンプレート) を使用して、古いコードが新しいコードを使用する方法がわかりません。私の以前の関連する質問から、Ben Voigtは次のようにコメントしました。

「古い」テンプレート コードを「新しい」テンプレート コードと組み合わせるには、両方を一緒にコンパイルする必要があります。

C++ SuperFAQは、新しいコードを使用するために古いコードを新しいコードで再コンパイルする必要はなく、古いコードのオブジェクト ファイルのみが必要であることを (OO とジェネリック プログラミングの両方で) 暗示しているようです。これにより、コードの再利用性が維持されます。

テンプレートが静的バインディングであるにも関わらず、古いコードのオブジェクト ファイルが汎用プログラミング パラダイムを使用する新しいコードを使用できる「理由」と「方法」について誰かが答えてくれませんか?

編集

以下の回答をもう少し詳しく説明したいと思います. ジェネリック プログラミングは静的バインディングを使用するため、コードの再利用性を有効にするには、古いコードのソース コードと新しいコードのソース コードの両方を"一緒に"再コンパイルする必要があります。つまり、古いコードのオブジェクト ファイルしかない場合、実行時にバインドする動的/遅延バインディングが必要になるため、新しいコードを使用することはできません。

4

2 に答える 2

3

短い答えは、それはできないということです。それが、リンクした回答の最初の文が意図していたことだと思います。

実行時 (仮想関数) またはコンパイル時 (テンプレート)に提供される新しいコードを古いコードで呼び出せるようにすることで、再利用を改善できます。

【強調追加】

既存のコードでテンプレートを利用するには、再コンパイルする必要がありますつまり、オブジェクト ファイルではなく、(何らかの形の) ソース コードから開始する必要があります (少なくとも、ほとんどの人が通常のオブジェクト ファイルと考えているものではありません)。

于 2015-04-10T02:57:18.410 に答える