因此,我正在关注2D游戏的C ++ / SDL2编程教程系列。我一直在跟踪this视频,他写了这段代码。
using ComponentID = std::size_t;
inline ComponentID getComponentID()
{
static ComponentID lastID = 0;
return lastID++;
}
template <typename T> inline ComponentID getComponentID() noexcept
{
static ComponentID typeID = getComponentID();
//typeID below is being used like a function???
return typeID(); //<- error and won't compile, I believe this was a typo
}
我不明白为什么将template<typename T>
放在inline ComponentID getComponentID() noexcept
的行上。为什么在那里?显然,模板声明后没有分号,因此我想可以将其放在同一行上,但是为什么呢?有什么我想念的吗?我还没有完成视频,这使我感到困惑,也不想只看完整的视频复制代码,而不了解它。有提示吗?
编辑:我知道模板是如何工作的,我不需要上一课。但是该函数的声明中已经有一个返回类型,这正是我要问的。不适合陌生人教我有关C ++语言的信息。
template <typename T> inline ComponentID getComponentID() noexcept
ComponentID (也称为std::size_t
)已经指定返回类型吗? T
的定义放在同一行上,未在该函数中使用。这就是我要问的。我错过了什么?因为我不认为一个函数可以有多个返回类型。因此,由于它不是返回类型,并且不在函数本身中使用或作为参数的类型使用,因此在此上下文中它的用途是什么?
答案 0 :(得分:3)
目标是按类型拥有唯一的增量ID。
所以
ComponentID getComponentID()
{
static ComponentID lastID = 0;
return lastID++;
}
template <typename T>
ComponentID getComponentID() noexcept
{
static ComponentID typeID = getComponentID();
return typeID; // () was a typo indeed
}
我们将拥有
struct Component1 {};
struct Component2 {};
getComponent<Component1>(); // Will return 0
getComponent<Component2>(); // will return 1
getComponent<Component1>(); // Will return 0
getComponent<Component2>(); // will return 1
答案 1 :(得分:0)
使用模板来调整功能或类以支持多个内置或自定义类型。这样,您可以在同一代码中使用不同的类型,最终减少重复的代码。
想象您的getComponentID()必须返回一个int,并且在另一种情况下也需要它返回一个double。如果getcomponentid()
不是模板函数,则必须重载该函数以处理int和double返回类型。由于您使用的是模板,因此您无需进行处理。编译器将为您处理。
值得注意的是,模板可能会减慢您的编译时间。
http://www.cplusplus.com/doc/oldtutorial/templates/
跟进您的修改:
他没有返回模板类型。而不是做
template<typename T>
inline ComponentID getComponentID()
{
...
...
}
他把所有东西都放在一行。
template <typename T> inline ComponentID getComponentID()
您真的, 网上有些陌生人-.-