web-dev-qa-db-ja.com

テンプレートでのエクスポートキーワードの使用

私が理解するように、「エクスポート」キーワードを使用して、ヘッダーファイルを通じてテンプレートクラスまたは関数シグネチャを公開し、ライブラリファイル内の実際の実装を抽象化することができます。
誰でもこれを行う方法を示す実用的なサンプルプログラムを提供できますか?
これを使用する際に注意すべき不利な点や重要な点はありますか?

編集:回答に基づくフォローアップの質問。回答で述べたように、「エクスポート」はC++ 0xでは非推奨であり、C++ 03xであってもコンパイラーでサポートされることはほとんどありません。このような状況で、実際の実装をlibファイルに隠し、ヘッダーファイルを介して宣言を公開する方法はありますか?エンドユーザーは、公開されたAPIのシグネチャが何であるかを知ることができますが、それを実装するソースコードにアクセスできませんか?

34
Alok Save

まず、ほとんどのコンパイラ(gcc、Clang、Visual Studioを含む)はexportキーワードをサポートしていません。

これはEDGフロントエンドという単一のフロントエンドで実装されているため、それを使用するコンパイラー(Comeauおよびicc)のみがこの機能をサポートしています。 EDGの実装者からのフィードバックは非常にシンプルでした:時間がかかり、非常に複雑だったので、実装しないことをお勧めします(1)。 C++ 0x。

現在、標準は許可しています(これは少なくともgccによって実装されています):

  • ヘッダーでテンプレート関数の特殊なバージョンを宣言する
  • この特殊化を単一のソースファイルで定義する

そして、あなたが通常の機能から期待するようにそれを振る舞わせること。

注:Johannesがコメントで指摘しているように、関数の完全な特殊化がヘッダーで定義されている場合は、インラインとしてマークする必要があります。そうしないと、リンカーが不平を言うでしょう。

編集:

(1)最後に私の参考文献を見つけました なぜ輸出ができないのか(PDF) Tom Plum、レビュー元はEDGに実装したEdison Design GroupのSteve Adamczyk、John Spicer、Daveed Vandevoordeです。フロントエンド。

44
Matthieu M.
12
ltc

ほとんどのコンパイラがエクスポートをサポートしていないため、サンプルプログラムを提供することは困難です。 g ++は、サポートされていないという警告を報告し、IIRCはVisual Studioでコンパイルすらしません。さらに、エクスポートはC++ 0xでは非推奨です。つまり、将来のコンパイラーでエクスポートがサポートされる可能性はほとんどありません。

エクスポートをサポートしているいくつかのコンパイル(つまり、コモーC++)でエクスポートを使用する方法については、 このリンクを確認 を使用して、エクスポートを実装するのが難しい理由を説明します。

そして、これが主要な反輸出の怒りとして出くわした場合はお詫びします。私は輸出を嫌わないと約束します!それは広くサポートされていないだけで、プログラマーとして本当にそれに頼ることはできません。

5
templatetypedef

多くのコンパイラベンダーがこれをサポートしなかった理由は、それが機能しても、プログラマが期待するようには機能しないためです。

私が問題について見つけた最高の記事はここにあります:

http://msmvps.com/blogs/vandooren/archive/2008/09/24/c-keyword-of-the-day-export.aspx

テンプレートをインスタンス化したほうがよいでしょう。

1
CashCow

エクスポートのようなタイトルの記事を読みましたが、サポートされていませんし、とにかくあなたが望むことをしません。

あなたが望むことをする唯一の方法は、言われたように完全に専門化することです。しかし、それ以上に、ライブラリのソースコードが表示されない場合は、コンパイルできません。これは、対応する削除を新しいものに使用する保証がないため、そこから動的メモリを受け入れることができないことを意味します。たとえば、私のコードがデバッグでライブラリがリリースされている場合、削除プログラムは新しいコードと一致しません。 shared_ptrを使用して削除機能を提供することもできますが、これはTR1であり、エクスポートはありません。

0
Tavison