C ++:仅头文件项目,静态const非整数

时间:2013-03-08 12:49:25

标签: c++

我有一个仅限标题的项目。在里面我有一堂课。在它内部(或其他任何地方)我希望有恒定的数据(枚举值为字符串和反之亦然)。这个问题似乎比我预期的要困难得多。

typedef boost::bimap<MyEnum,std::string> Data;

我尝试过但没有效果

  1. static Data const s_data = _initData();:错误就像: only static const integral data members can be initialized within a class

  2. static Data const * const s_pData = _initData();_initData()函数有一个静态局部变量(在第一次调用时变为填充),并返回它的地址。没有与上述相同的原因工作。

  3. 我尝试和工作的内容,但我认为它很难看:

    class Ugly {
    public:
        static MyEnum lookupByName(std::string s)
        {
            MyEnum ret;
            lookup(ret,s,true);
            return ret;
        }
        static String lookupByEnum(MyEnum e)
        {
            std::string ret;
            lookup(e,ret,false);
            return ret;
        }
        static void lookup(MyEnum &e, std::string &s, bool etos)
        {
            static Data s_data = _fill();
            if(etos)
                s = /* ... */;
            else
                e = /* ... */;
        }
        static Data _fill(){ /* ... */ };
    };
    

    想法?

1 个答案:

答案 0 :(得分:6)

更简单的是

static T& global_t()
{ static T z = initializer; return z; }

global_t()可用于需要T值的地方。

注意: 在回答rioki注释时,我们还必须将函数指定为inline,如果它处于全局或命名空间级别(以避免链接器的“多实例”问题)。

如果函数是模板或者是类成员函数(默认情况下为内联定义),则不需要inline关键字。

如果static T实例化必须在不同的操作系统模块之间共享(读取:DLL),则rioki是完全正确的,但是 - 在这一点上 - 只有标题库才没有意义。