函数声明中的模板声明已经具有返回类型?

时间:2018-09-26 17:06:09

标签: c++ c++11

因此,我正在关注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的定义放在同一行上,未在该函数中使用。这就是我要问的。我错过了什么?因为我不认为一个函数可以有多个返回类型。因此,由于它不是返回类型,并且不在函数本身中使用或作为参数的类型使用,因此在此上下文中它的用途是什么?

2 个答案:

答案 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()

您真的, 网上有些陌生人-.-