我想知道这段代码到底是如何工作的(例如,它如何直接访问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
答案 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
警告,模板远不止于此,它只是该示例如何工作并产生输出的非常简单的解释,请不要从字面上理解^^