【发布时间】:2019-01-28 14:21:00
【问题描述】:
我想知道这段代码具体是如何工作的(例如,它如何能够直接访问 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
【问题讨论】:
-
很难说你的问题是什么......这是一个模板函数,它访问给定对象/类型的成员。只有当这些成员存在时才会编译。这就是模板应该表现的所有方式,并且像这样使用它们并不少见......
-
基本上,删除
template<>的东西并将T替换为FileA::Foo。产生的任何代码和行为是否让您感到惊讶?如果是,那与模板无关。如果不是,上述替换就是编译器为实例化模板所做的全部工作。 -
@user463035818 在枚举定义中尾随
,是definitely ok。 -
@MaxLanghof 嗯好的,那么我今天已经学到了一些东西。而且,对不起@ OP ;)
-
你的问题不太清楚,这个“成语”没有名字。实际上不清楚你认为这段代码有什么特别之处,它值得一个名字,也许你可以解释更多? “传递这样的模板参数很常见吗?” 否则您将如何传递模板参数?
标签: c++ function templates parameters