лучшая альтернатива инициализации статических членов класса по определению? (для ключевых слов SVN) - PullRequest
2 голосов
/ 07 мая 2010

Я храню расширенные литералы ключевых слов SVN для файлов .cpp в членах класса 'static char const * const' и хочу сохранять описания .h как можно более похожими. Короче говоря, мне нужно гарантировать создание единственного экземпляра статического члена (предположительно в файле .cpp) для автоматически сгенерированного нецелого литерала, живущего в потенциально совместно используемом файле .h. К сожалению, язык не пытается разрешить множественные экземпляры, являющиеся результатом присваиваний, сделанных вне определений классов, и явно запрещает нецелые начальные числа внутри определений классов. Моя лучшая попытка (использование внутренних классов со статическим переносом) не слишком грязная, но я бы действительно хотел сделать лучше. У кого-нибудь есть способ шаблонирования обертки ниже или у него вообще превосходный подход?

// 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, где код определения был видим в определениях классов для любого вызывающего абонента, но фактически вызывался только в точке одного объявление в другом месте.

Во всяком случае, я отвлекся. Каково лучшее решение для языка, который у нас есть, шаблон или другой? Спасибо!

Ответы [ 2 ]

1 голос
/ 07 мая 2010

наверное, со статической функцией?

// 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());
0 голосов
/ 07 мая 2010

Может быть, вы могли бы что-то сделать с макросами.

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

...

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

Я обычно избегаю макросов, но в этом случае это может быть самое чистое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...