gpt4 book ai didi

C++:仅 header 项目,静态常量非整数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:04 32 4
gpt4 key购买 nike

我有一个只有标题的项目。在里面我有一个类。在它里面(或实际上其他任何地方)我想要常量数据(枚举值到字符串,反之亦然)。这个问题似乎比我预期的要难得多。

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

我尝试过并工作过,但我认为它很丑陋:

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(){ /* ... */ };
};

想法?

最佳答案

更简单的是

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

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

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

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

如果 static T 实例化必须在不同的 OS 模块(读取:DLL)之间共享,那么 rioki 是完全正确的,但是 - 在这一点上 - 一个只有头文件的库没有意义。


从 C++17 开始,inline 说明符也可以用于变量。

所以,从 C++17 开始,你可以只写

inline T global_object = initializer;

您还可以对函数的静态成员使用内联,以提供内联初始化,例如

class Class
{
static inline Type static_object_name = initializer;
};

关于C++:仅 header 项目,静态常量非整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15294374/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com