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

Not*_*ist 4 c++

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

typedef boost::bimap<MyEnum,std::string> Data;
Run Code Online (Sandbox Code Playgroud)

我尝试过但没有用的东西:

  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()函数有一个静态局部变量(在第一次调用时填充),并返回它的地址.没有与上述相同的原因工作.

我尝试和工作过,但我觉得它很难看:

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(){ /* ... */ };
};
Run Code Online (Sandbox Code Playgroud)

想法?

Emi*_*lia 7

更简单的是

static T& global_t()
{ static T z = initializer; return z; }
Run Code Online (Sandbox Code Playgroud)

global_t() 可以在需要T值的地方使用.

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

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

如果static T实例化必须在不同的OS模块之间共享(读取:DLL),则rioki是完全正确的,但是 - 在这一点上 - 仅限标头的库不再有意义.

  • 这是使用仅标头库的唯一方法.请注意,在Windows上,您将获得多个实例,每个模块一个(dll/exe).唯一的解决方案是构建一个DLL.(静态库不会这样做.) (2认同)