struct A
{
template <class U>
void f(U)
{
}
};
template <class T>
void f(T t)
{
A a;
a.template f<int>(t);
a.template f<>(t);
a.f<int>(t);
a.f<>(t);
a.f(t);
}
至少在MSVC2010下,上面的代码编译得很好。
在调用A.f
的所有方式中,是否有任何优惠方式可以做到这一点?
有什么不同吗?
答案 0 :(得分:5)
好吧,a
的类型为A
,在此上下文中不是依赖类型。因此,template
关键字不是必需的,仅用于模糊代码 - 不要使用它。
在不提供任何参数的情况下调用模板的版本再次没有改变行为,只会使代码不易读取 - 也不要使用它。
在剩下的两个候选者a.f(t)
和a.f<int>(t)
之间,在大多数情况下使用第一个,如果编译器无法推断出类型,则使用第二个。
答案 1 :(得分:1)
最后一个似乎最容易写。
否则没有差异,除非你必须消除几个f之间的歧义。
答案 2 :(得分:1)
完全没有差异。如果您没有任何理由为该功能提供类型信息,那么最后一个是最好的。但是您可能希望您的函数处理参数,就好像它们是指定类型一样,只有这样才需要&lt;&gt;。例如
T Divide(T a, T b)
{
return a/b;
}
如果你打电话给Divide(5,2),你会得到2.只有这样的情况,你应该指定类型:
Divide<float>(5,2);
它返回2.5。