0

テンプレートを使用するかどうかについて疑問に思っていましたが、他のスレッドで、何らかの理由でテンプレートをヘッダー ファイルに実装する必要があることがわかりました。わかりました、私の質問は、他のプログラムがそれを使用する場合、ソースが必要になるかどうかです? 他のスレッドの回答のロジックから、他のプログラムでさえ完全な実装が必要であるように思われるため、コンパイラーは、行がテンプレート化された関数を使用できるかどうかを判断できます。

はいの場合、他の人に自分のライブラリを使用してもらいたい開発者にとって、テンプレートは良いことではないと思いますか? いいえの場合は問題なく、テンプレートが使用されます。

または、少なくとも、苦労して費やした時間のコードを他の人から保存する方法がある場合は?

(私はstlベクトルなどを使用しますが、私は自分のコードを求めています...テンプレートはいいようです。多くのハードコーディングされた行やマクロの悪用を節約できますが、他の人があなたのソースを読むことができる場合、それはほとんど意味がありません[プロジェクトを開くのはとても理にかなっています xD])

ありがとう、ジョー

4

3 に答える 3

4

ライブラリのユーザーがテンプレートを使用できるようにする場合は、それらのユーザーがソースコードを利用できるようにする必要があります。

ただし、ほとんどのロジックがヘッダーに完全なソースコードを含まない非テンプレートクラスで発生するように、テンプレートクラスを設計できる場合があります。

于 2009-10-07T22:05:09.810 に答える
2

テンプレートがライブラリインターフェイスの一部であるか、実装の一部であるかによって異なります。

それらがインターフェイスの一部である場合(つまり、エントリポイントが特定のテンプレートタイプのオブジェクトを返す場合)、はい、テンプレート定義を外部に公開する必要があります。

ただし、テンプレートが実装の一部にすぎない場合は、ライブラリを構築したら、ライブラリのコンシューマーとテンプレート定義を共有する必要はありません。

于 2009-10-07T22:05:54.833 に答える
0

非テンプレート (多くの場合、タイプセーフではない) コードのラッパーとしてテンプレートを作成できます。

利点は...

  1. テンプレート以外の実装コードのソースを配布する必要はありません。
  2. テンプレートの肥大化を減らす良い方法です。

明らかな欠点は、抽象化とオーバーヘッドの余分なレイヤーがあり、型保証されていない実装コードには明らかに注意が必要なことです。私は、テンプレート ラッパーに特化した、非テンプレート コードで定義された抽象的な「ツール」クラスを持つ傾向があります。メソッドは主にツールの状態ではなく、void* パラメーターとして渡されたオブジェクトに対して作用するため、私はこれをツールと呼んでいます。ツール クラスは、ほとんどの型安全性の問題をいくつかのメソッドにカプセル化します。テンプレートは、ユーザーが実際に使用する型安全なラッパーも提供します。これは、安全でないコードへのインターフェイスであり、ツール インスタンスを提供し、型キャストなどを行います。

たとえば、ツリー データ構造を実装している場合、ほとんどのツリー アルゴリズムはタイプセーフではなく、ノードとデータ項目を void* ポインター (または、ノードとデータが宣言されているが未定義の構造体を持つノード* とデータ* ポインター) として認識します。 )。ノードの作成、破棄、およびその他の基本的な操作のための純粋なメソッドを備えた抽象ツリー ツール ベースを用意し、ラッパー テンプレートは基本的にツリー ツールを特殊化し、ノードとデータ項目の正確な型を認識するメソッドの実装を提供します。ツールのインスタンスをクラスメンバーとして保持します。ユーザーにとって、ラッパーは、他のものと同じように、タイプセーフなコンテナーにすぎません。

ところで - テンプレート ラッパーを実装するときは、依存名の問題に注意してください。

于 2009-10-08T00:25:41.973 に答える