代码之家  ›  专栏  ›  技术社区  ›  Jeff

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

  •  2
  • Jeff  · 技术社区  · 14 年前

    我正在“static char const*const”类成员中存储.cpp文件的扩展svn关键字文本,并希望尽可能地存储.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 member qualifier),那么非常方便,其中定义代码在类定义中对任何调用方都可见,但实际上只在其他地方的单个特殊声明点调用。

    不管怎样,我离题了。对于我们现有的语言,模板或其他语言,什么是最好的解决方案?谢谢!

    2 回复  |  直到 14 年前
        1
  •  1
  •   Alsk    14 年前

    可能,使用静态函数?

    // 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());
    
        2
  •  0
  •   BatchyX    14 年前

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

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

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

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