我观看了一段视频,其中有人解释了 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/