c++ - 为什么相同的模板类会得到相同的静态 ID?

标签 c++ templates static

我观看了一段视频,其中有人解释了 ECS 系统如何在 C++ 中工作。 他包括以下用于获取不同组件的 ID 的代码。

inline std::size_t GetCompTypeID() {

    static std::size_t lastID = 0;
    return lastID++;
}

template<class T>
inline std::size_t GetCompTypeID() {

    static std::size_t typeID = GetCompTypeID();
    return typeID;
}

现在,当我传入一个 int 变量,然后是一个 char,然后又是一个 int 变量时,两个整数变量将产生相同的 ID。

这是我不明白的部分。我知道模板通常只在编译时被调用存在,但我仍然调用该函数三次,因此 lastID 也增加了三倍,独立于我传递的实际类。

为什么会这样?

最佳答案

您将模板实例化两次 - 一次用于 int,一次用于 char - int 实例化被调用两次。
这些实例化与任何其他带有静态变量的函数一样工作。

您的用例等同于此:

inline std::size_t GetCompTypeID() {

    static std::size_t lastID = 0;
    return lastID++;
}

inline std::size_t GetCompTypeID_int() {

    static std::size_t typeID = GetCompTypeID();
    return typeID;
}

inline std::size_t GetCompTypeID_char() {

    static std::size_t typeID = GetCompTypeID();
    return typeID;
}

int main()
{
    std::size_t int_id1 = GetCompTypeID_int();
    std::size_t char_id = GetCompTypeID_char();
    std::size_t int_id2 = GetCompTypeID_int();
}  

如果你明白为什么 int_id1 == int_id2,你就会明白发生了什么。

如果不了解,请阅读您最喜欢的书中有关静态变量的内容。

关于c++ - 为什么相同的模板类会得到相同的静态 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57452871/

相关文章:

c++ - 模板变量的默认返回值

c++ - 返回模板的嵌套类时出现语法错误

java - 从静态方法调用 super 方法

c++ - c1xx : fatal error C1083: Cannot open source file - with some Chinese or Javanese

c++ - 在集合 0-N 中找到基数 C 的所有可能子集

c++ - 确定类类型

javascript - 使用 Vue JS 将参数作为 Html 中的变量传递给模板的问题

swift - 在枚举中生成随机类型的静态函数会导致崩溃并出现错误 "unexpectedly found nil when unwrapping an Optional value"

c++ - 是否允许并接受用删除标记静态方法?

c++ - 为什么不能将此参数包直接解包到 vector 初始值设定项列表中?