gpt4 book ai didi

c++ - 我怎样才能为唯一的类组合获得一致的、唯一的标识符?

转载 作者:行者123 更新时间:2023-12-05 03:25:03 25 4
gpt4 key购买 nike

我需要一种方法来识别模板类型的唯一组合,从而为我提供易于索引的标识符。

我有以下类(class):

#include <cstdint>

typedef std::uint32_t IDType;

template<class T>
class TypeIdGenerator
{
private:

static IDType m_count;

public:

template<class U>
static IDType GetNewID()
{
static const IDType idCounter = m_count++;
return idCounter;
}
};

template<class T> IDType TypeIdGenerator<T>::m_count = 0;

这有效,但是当跨 dll 和 exe 使用时,每个进程中的每个“实例”都会重置计数,因此如果在 .dll 中我有:

IDType id = TypeIdGenerator<A>::GetNewID<B>();

对于在 .exe 中使用相同的两个类进行的相同调用,它将是不同的值:

IDType id = TypeIdGenerator<A>::GetNewID<B>();

当然,这只有在不同类的类型以不同顺序生成时才会发生。

我知道静态成员在每个进程中都是静态的,而 dll 是另一个进程,那么我还能如何轻松检索一致的唯一 ID?

我更喜欢使用标准方法,没有特殊的编译器扩展或标志等。

编辑:关于我的用例的更多信息。

我有一个包含另一种类型的模板类,因此我可以使用该模板类型对任意数据进行操作。非常简单:

class ComponentBase
{
public:
virtual ~ComponentBase() {}

virtual void DestroyData(unsigned char* data) const noexcept = 0;
virtual void MoveData(unsigned char* source, unsigned char* destination) const = 0;
virtual void ConstructData(unsigned char* data) const = 0;
};

template<class C>
class Component : public ComponentBase
{
public:
typedef C type;

virtual void DestroyData(unsigned char* data) const noexcept override
{
C* dataLocation = std::launder(reinterpret_cast<C*>(data));

dataLocation->~C();
}

virtual void MoveData(unsigned char* source, unsigned char* destination) const override
{
new (&destination[0]) C(std::move(*reinterpret_cast<C*>(source)));
}

virtual void ConstructData(unsigned char* data) const override
{
new (&data[0]) C(*m_component);
}
};

这是因为 A 的实例或 B需要并排存储在 unsigned char* 中阵列。通过存储 std::unordered_map<IDType,ComponentBase*> 的 map s 我可以继续访问所有构造函数、析构函数、移动运算符等。

我有一个容器,可以为我提供关于 unsigned char* 中哪个索引的信息是IDType对于 AB等等

因此,在对我的数据进行操作时,我会有一个 std::vector<IDType> 的容器从头到尾为我提供了存储在 unsigned char* arbitrary 中的每种类型.

我可以使用 IDType 来查找我的 unordered_map<IDType, ComponentBase*>这样我就可以对存储在 arbitrary 中的类型进行操作.

显然它比这复杂一点,否则我只存储 ComponentBase* s,但这就是为什么我需要能够生成某些可索引类型的一致类型 ID 的一般要点。仅在我的程序的同一执行期间保持一致,而不是在不同的执行之间保持一致(尽管那将是一个奖励)。

我正在使用通过 MSYS2 交付的 MingW64。

最佳答案

您可以使用散列函数生成“唯一”散列,而不是增加计数器来创建类型 ID。虽然存在一定的碰撞机会,但如果哈希函数有效,则风险非常低。这种方法会在整个程序调用过程中为每种类型提供一致的 ID。

为此,C++实际上提供了一个typeid返回 type_info 的运算符类实例。 type_info 类实现了一个 hash_code()保证为每个唯一类型返回唯一哈希的函数。

文档指出,此哈希值可能会在同一程序的调用之间发生变化,因此这不适用于多个不同的调用。

type_info 类也可用于获取唯一的 type_index可以直接用于索引关联容器。

关于c++ - 我怎样才能为唯一的类组合获得一致的、唯一的标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72122018/

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