2

.cpp ファイルの拡張 SVN キーワード リテラルを 'static char const *const' クラス メンバーに保存しており、.h の説明をできるだけ同様に保存したいと考えています。要するに、潜在的に共有されている .h ファイルに存在する自動生成された非整数リテラルに対して、静的メンバー (おそらく .cpp ファイル内) の単一のインスタンス化を保証する必要があります。残念ながら、この言語は、クラス定義の外側で行われた割り当てに起因する複数のインスタンス化を解決しようとせず、クラス定義内の非整数の初期化を明示的に禁止します。私の最善の試み (静的ラッピング内部クラスを使用) はそれほど汚れていませんが、もっとうまくやりたいと思っています。以下のラッパーをテンプレート化する方法や、完全に優れたアプローチを持っている人はいますか?

// Foo.h: class with .h/.cpp SVN info stored and logged statically
class Foo {
  static Logger      const verLog;
  struct hInfoWrap;
public:
  static hInfoWrap   const hInfo;
  static char const *const cInfo;
};

// Would like to eliminate this per-class boilerplate.
struct Foo::hInfoWrap {
  hInfoWrapper() : text("$Id$") { }
  char const *const text;
};

...

// Foo.cpp: static inits called here
Foo::hInfoWrap  const Foo::hInfo;
char const     *const Foo::cInfo = "$Id$";
Logger          const Foo::verLog(Foo::cInfo, Foo::hInfo.text);

...

// Helper.h: output on construction, with no subsequent activity or stored fields
class Logger {
  Logger(char const *info1, char const *info2) {
    cout << info0 << endl << info1 << endl;
  }
};

文字列リテラルで hInfoWrap クラスをテンプレート化するための静的リンケージ アドレスの問題を回避する方法はありますか? クラス定義の外側に割り当てられた Extern char ポインターは言語的に有効ですが、メンバーの直接初期化と本質的に同じ方法で失敗します。言語が解決の問題全体を回避する理由はわかりますが、反転された extern メンバー修飾子が提供されていると非常に便利です。定義コードはクラス定義ですべての呼び出し元に表示されますが、実際には単一の特別な時点でのみ呼び出されます他の場所での宣言。

とにかく脱線します。私たちが持っている言語、テンプレート、またはその他の最適なソリューションは何ですか? ありがとう!

4

2 に答える 2

1

おそらく、静的関数で?

// Foo.h: 
class Foo {
  static Logger      const verLog;
  static char const*const getHInfo() { return "$Id$"; }
public:
  static char const *const cInfo;
};

// Foo.cpp: static inits called here
char const     *const Foo::cInfo = "$Id$";
Logger          const Foo::verLog(Foo::cInfo, Foo::getHInfo());
于 2010-05-07T11:17:22.323 に答える
0

マクロで何かできるかもしれません。

// Foo.h
#define FOO_HINFO "$Id$"

...

// Foo.cpp
char const     *const Foo::hInfo = FOO_HINFO;

私は通常マクロを避けますが、この場合は最もクリーンなソリューションかもしれません。

于 2010-05-06T23:31:35.820 に答える