静态类成员的定义内初始化的最佳替代方案? (对于SVN关键字)

时间:2010-05-06 23:24:07

标签: c++ header initialization static-members

我将.cpp文件的扩展SVN关键字文字存储在'static char const * const'类成员中,并希望尽可能相似地存储.h描述。简而言之,我需要保证将静态成员(可能在.cpp文件中)单个实例化为生成在可能共享的.h文件中的自动生成的非整数文字。不幸的是,该语言没有尝试解决由于在类定义之外进行的赋值而导致的多个实例化,并明确禁止在类定义中使用非整数inits。我最好的尝试(使用静态包装内部类)并不是太脏,但我真的想做得更好。有没有人有办法模板下面的包装或有一个更好的方法?

// 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 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

也许你可以用宏做点什么。

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

...

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

我通常会避免使用宏,但在这种情况下,它可能是最干净的解决方案。