首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义静态const通用唯一标识符(UUID)

定义静态const通用唯一标识符(UUID)
EN

Stack Overflow用户
提问于 2012-10-18 08:51:38
回答 1查看 2.4K关注 0票数 2

上下文

我经常使用Boost库的UUID实现来标识派生类。为此,我通常使用以下方法:

在声明文件中:

代码语言:javascript
复制
  #include "ClassA.h"
  #include <boost/uuid/uuid.hpp>

  class SubClass1 : public ClassA {
    public:
      static const boost::uuids::uuid classId; // 7feb24af-fc38-44de-bc38-04defc3804de
    ... 
  };

在实现文件中:

代码语言:javascript
复制
  #include "SubClass1.h"
  #include <boost/uuids/uuid_generator.h>

  const boost::uuids::uuid SubClass1 ::classId = boost::uuids::string_generator()("{7feb24af-fc38-44de-bc38-04defc3804de}");
  ...

问题

我想知道是否可以在声明文件.中为UUID赋值。

想法

起初,我认为这是可能的,因为Boost实现是POD。因此,我尝试了几种使用聚合初始化器直接在报头中赋值的方法(关于非静态聚合初始化器的示例,请参见boost文档 ):

代码语言:javascript
复制
  static const boost::uuids::uuid classId = { 0x7f, 0xeb, ... };

不幸的是,它在编译时失败了(编译器只能初始化静态const整型)。

您有什么建议来解决这个问题,最好是使用UUID的Boost实现吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-18 09:35:46

将非整数常量定义为头文件中的类成员的最简单方法是将其封装在函数中,如下所示:

代码语言:javascript
复制
typedef whatever Uuid;

class MyClass
{
public:
    static Uuid const& uuid()
    {
        Uuid const theValue = ...;
        return theValue;
    }
};

如果您希望它是一个实际的常量,而不是一个函数,那么您可以使用一些模板技巧,如下所示:

代码语言:javascript
复制
template< class Dummy >
class MyClass_constants
{
public:
    static Uuid const uuid;
};

template< class Dummy >
Uuid const MyClass_constants<Dummy>::uuid = ...;

class MyClass
    : public MyClass_constants<void>
{};

使用C++11,您可以使用constexpr,如下所示:

代码语言:javascript
复制
class MyClass
{
public:
    static Uuid constexpr uuid = ...;
};

但是,尽管这方面的测试在没有g++ 4.7.1链接器警告的情况下编译得很好,但它太新了,我不确定标准的“一个定义规则”是否真的支持它,或者,在多个翻译单元中使用这样的定义,我是否对未定义的行为感兴趣。

因此,如果您想做constexpr,也许可以问一个关于ODR的单独问题。

作为一种选择,您可以等待C++2040标准,然后只需编写

代码语言:javascript
复制
inline static Uuid const uuid = ...;

值得思考的是,正如所示,即使在C++98中也可以模仿这个假设的未来特性,即所需的一切都已经由编译器和链接器实现,并且从第一个标准开始就已经实现了。然而,这个简单的特征在语言中却是缺乏的。我认为,这是由于一种偶然的历史语言演变。

无论如何,我会选择首先显示的简单函数包装器。:-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12950677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档