上下文
我经常使用Boost库的UUID实现来标识派生类。为此,我通常使用以下方法:
在声明文件中:
#include "ClassA.h"
#include <boost/uuid/uuid.hpp>
class SubClass1 : public ClassA {
public:
static const boost::uuids::uuid classId; // 7feb24af-fc38-44de-bc38-04defc3804de
...
};在实现文件中:
#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文档 ):
static const boost::uuids::uuid classId = { 0x7f, 0xeb, ... };不幸的是,它在编译时失败了(编译器只能初始化静态const整型)。
您有什么建议来解决这个问题,最好是使用UUID的Boost实现吗?
发布于 2012-10-18 09:35:46
将非整数常量定义为头文件中的类成员的最简单方法是将其封装在函数中,如下所示:
typedef whatever Uuid;
class MyClass
{
public:
static Uuid const& uuid()
{
Uuid const theValue = ...;
return theValue;
}
};如果您希望它是一个实际的常量,而不是一个函数,那么您可以使用一些模板技巧,如下所示:
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,如下所示:
class MyClass
{
public:
static Uuid constexpr uuid = ...;
};但是,尽管这方面的测试在没有g++ 4.7.1链接器警告的情况下编译得很好,但它太新了,我不确定标准的“一个定义规则”是否真的支持它,或者,在多个翻译单元中使用这样的定义,我是否对未定义的行为感兴趣。
因此,如果您想做constexpr,也许可以问一个关于ODR的单独问题。
作为一种选择,您可以等待C++2040标准,然后只需编写
inline static Uuid const uuid = ...;值得思考的是,正如所示,即使在C++98中也可以模仿这个假设的未来特性,即所需的一切都已经由编译器和链接器实现,并且从第一个标准开始就已经实现了。然而,这个简单的特征在语言中却是缺乏的。我认为,这是由于一种偶然的历史语言演变。
无论如何,我会选择首先显示的简单函数包装器。:-)
https://stackoverflow.com/questions/12950677
复制相似问题