0

私は、ユーザーが任意の構造を定義してライブラリに渡すことができるライブラリを作成しています。ライブラリは、そのような構造が慣例として持つ必要のある静的メンバーから構造のメモリレイアウトを取得します。

例えば:

struct CubeVertex {
  // This is, per convention, required in each structure to describe itself
  static const VertexElement Elements[];

  float x, y, z;
  float u, v;
};

const VertexElement CubeVertex::Elements[] = {
  VertexElement("Position", VertexElementType::Float3),
  VertexElement("TextureCoordinates", VertexElementType::Float2),
};

C ++のベストプラクティスでは、静的変数とその初期化をソース(.cpp)ファイルに移動することをお勧めします。ただし、構造が変更されるたびに変数も更新する必要があるため、変数の初期化を構造にできるだけ近づけたいと思います。

リンカからあいまいなシンボル/再定義エラーを発生させることなく、ヘッダーファイル内でそのような変数を宣言するための移植可能な(少なくともMSVC + GCC )方法はありますか?

4

2 に答える 2

3

ここでできることは、匿名の名前空間を使用することです。

すべてを「名前空間{...};」にラップします その後、通常どおりにCubeVertex::Elementsにアクセスできます。

ただし、これにより、ヘッダーファイルを含めるたびに静的データの新しいインスタンスが作成され、実行可能ファイルのファイルサイズが増加します。

また、別のファイルからそのクラスの関数を呼び出すことはできないため、クラス/構造体の使用方法にもいくつかの制限があります(この特殊なケースでは問題になりません)。

于 2012-07-05T12:58:44.740 に答える
3

単純なゲッターを考えてみましょう。

struct CubeVertex {
    static const std::array<VertexElement, N>& GetElements() {
         static const std::array<VertexElement, N> result = {
             //..
         };
         return result;
    }
    //..
}

即時のメリット:アレイからポインターへの減衰はありません。

于 2012-07-05T13:12:36.680 に答える