4

私たちのプロジェクトでは、次のようなものがあります。

struct PointI
{
  // methods for getting, setting and calculating some point stuff
private:
  int x;
  int y;
};

struct PointD
{
  // methods for getting, setting and calculating some point stuff
private:
  double x;
  double y;
};

私はそれをそのようなものに変更することを提案しました:

template<typename T>
struct Point
{
  // methods for gettig, setting and calculating some point stuff
private:
  T x;
  T y;
};

typedef Point<int> PointI;
typedef Point<double> PointD;
typedef Point<float> PointF;

しかし、それは拒否され、私は次のように言われました。

その議論は、多くのコードの重複を許すほど強力ですか?

4

3 に答える 3

4

あなたの上司(または何でも)はおそらく正しいです。C++ 以外の言語から使用できるライブラリを作成する場合は、通常、インターフェイスを C のみで作成することをお勧めします。

もちろん、テンプレートを内部で使用することはできますが、公開しないでください。

于 2010-12-04T10:15:38.920 に答える
1

テンプレートをエクスポートする方法がありません

これは、C リンケージ (つまり、エクスポート時に extern "C" を使用する場合) にのみ当てはまります。共有ライブラリからテンプレート クラスをエクスポートすることに技術的な問題はありません。C++ ランタイム ライブラリからエクスポートされた STL クラスについて考えてみてください。

CPP の名前マングリングが標準化されていないため、エクスポートされたクラスのクライアントは、同じコンパイラ (多くの場合、同じコンパイラ バージョン) を使用する必要がありますが、これは閉じた環境では許容される場合があります。ところで、これが、新しいソフトウェアをインストールする前に、Microsoft の Visual C++ 200X 再頒布可能パッケージをインストールしなければならないことが多い理由です。MS 再頒布可能パッケージは、特に Windows プラットフォーム上の CPP ランタイム ライブラリでこの問題を解決します。

于 2010-12-04T12:51:44.797 に答える
0

テンプレートをエクスポートする方法があります。Visual Studio を使用している場合__declspec(dllimport/dllexport)は、非常に強力な をチェックアウトできます。他のコンパイラがこれを提供しているかどうかはわかりません。ただし、C 互換のインターフェイスをエクスポートしない場合は、基本的に、まったく同じモデルではないにしても、少なくとも同じベンダーの同じコンパイラを使用することをユーザーに強制することになります。

于 2010-12-04T12:55:45.970 に答える