gpt4 book ai didi

c++跨编译单元的增量类型ID

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:22 25 4
gpt4 key购买 nike

我需要每个派生类都有一个唯一的 ID,但 ID 需要是递增的。这是我当前的实现:

//component.cpp
class ComponentId
{
public:
ComponentId();


static int nextId;
int id;
};

template<class T>
class Component {
public:
static const ComponentId componentId;
};

template<class T>
const ComponentId Component<T, chunkSize>::componentId;

///component.cpp
int ComponentId::nextId = 0;

ComponentId::ComponentId() : id(nextId++)
{
}

//IN static library a
struct compA : public Component<compA> {

}

//In static library b
struct compB : public Component<compB> {

}

//in main.cpp
#include <component.h>
#include <compA.h>
#include <compB.h>
std::cout << compA::componentId.id << std::endl;
std::cout << compB::componentId.id << std::endl;

这在我的所有单元测试中都运行良好,但在使用多个编译单元或跨静态库时似乎无法按预期运行。ID 在不同的库中重复使用。一个库可能有 ID 为 0、1、2 和 3,但另一个库也有 ID 为 0 和 1 的类。我的猜测是 nextid 字段没有被共享。

我也尝试过使用 extern 关键字,但它似乎产生了同样的问题。我也曾尝试制作一个静态 getId 函数,希望在首次使用时进行初始化,但没有这样的运气。

我确实需要 ID 是“紧凑的”,如 1、2、3、4、5,而不是 67、80、123、1、4。

有什么想法吗?

最佳答案

假设您想要单个 int跨多个 TU 共享的实例,我认为使用 inline返回对 static int 的引用的函数应该做的伎俩:

// counter.hpp
namespace detail
{
inline int& getCounter()
{
static int result{0};
return result;
}
}

inline int nextId()
{
return detail::getCounter()++;
}

// component.cpp
ComponentId::ComponentId() : id(nextId())
{
}

然而,这感觉很脆弱并且容易出错,尤其是当您打算依赖您的 ID 进行序列化/反序列化时。如果您在编译时知道组件的所有类型,我建议使用类型列表。例如

using components = typelist<
Component0,
Component1,
Component2,
Component3
>;

否则,如果您只知道运行时的组件类型,请提供某种注册表,允许用户以受控方式注册/注销类型。

关于c++跨编译单元的增量类型ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49363993/

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