使用类参数化函数并访问类成员

时间:2019-01-28 14:21:00

标签: c++ function templates parameters

我想知道这段代码到底是如何工作的(例如,它如何直接访问TYPE的值)。

我在较大的代码库中看到了此代码(该代码库是非公开的,因此该示例已释义)。我从未见过这种特定的用例。传递这样的模板参数很常见吗?是否有特定名称/这是一个习惯用法/模式吗?您什么时候使用它?为什么?

#include <iostream>

namespace FileA
{
struct Foo
{
    enum TYPE
    {
        ENTRY,
    };

    void callme()
    {
        std::cout << "Foo\n";
    }
};
}

namespace FileB
{
template <typename T>
void fun(T& obj)
{
    std::cout << T::ENTRY << "\n";
    obj.callme();
}
}

int main()
{
    FileA::Foo f;
    FileB::fun(f);
}

这将打印:

0
Foo

1 个答案:

答案 0 :(得分:2)

从一般意义上来说,模板是一种宏,因此如果您“ expand” FileB::fun(f); T被 f 成为FileA::Foo,就好像您有:

void fun(FileA::Foo& obj)
{
    std::cout << FileA::Foo::ENTRY << "\n";
    obj.callme();
}

因为FileA::Foo::ENTRY为0,所以 std :: cout 写入0,然后应用FileA::Foo::callme(),其打印结果为 Foo

警告,模板远不止于此,它只是该示例如何工作并产生输出的非常简单的解释,请不要从字面上理解^^