跨共享库的模板中的局部静态变量

时间:2018-07-21 10:28:25

标签: c++ templates static rtti

我正在尝试为每个类型名生成唯一索引。 这一代需要跨共享库含义工作 必须在运行时完成。

示例:

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;
    }

0 个答案:

没有答案