我正在尝试为每个类型名生成唯一索引。 这一代需要跨共享库含义工作 必须在运行时完成。
示例:
size_t id0 = componentSection<Type1>();
size_t id1 = componentSection<Type2>();
size_t id2 = componentSection<Type1>();
return (id0 == id2 && id1 != id0 && id1 != id2);
我在模板中使用静态变量。
代码建议:
private:
template<typename C>
size_t generateNewSection() noexcept
{
m_componentLists.emplace_back(std::make_unique<ComponentList<C>>());
return m_componentLists.size() - 1;
}
public:
template<typename C>
size_t componentSection() noexcept
{
static size_t section = generateNewSection<C>();
return section;
}
如您所见,我使用static的初始化属性来确保 索引保持不变。
问题:
在共享库中生成的索引不同,因为静态 每个库都会“重新生成”变量。我应该动静 源文件中的定义以确保地址相同。 但是我不能,因为我使用模板...每个静态变量都无法链接。 我不知道如何解决这个问题。
谢谢。
编辑
我的问题被设置为重复,但是我仍然不知道如何解决我的问题 问题。我了解共享库的静态问题,但是有解决方案吗?
解决方案
我最终决定选择此解决方案:
private:
std::unordered_map<std::type_index, size_t> m_indexes;
template<typename C>
size_t getSection() noexcept
{
std::type_index index = std::type_index(typeid(C));
if(m_indexes.find(index) != m_indexes.end())
return m_indexes.at(index);
m_componentLists.emplace_back(std::make_unique<ComponentList<C>>());
m_indexes[index] = m_componentLists.size() - 1;
return m_componentLists.size() - 1;
}
public:
template<typename C>
size_t componentSection() noexcept
{
static size_t section = getSection<C>();
return section;
}