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