C++ 调用模板函数的常规方法 结构A { 样板 空f(U) { } }; 样板 空隙f(T) { A A; a、 模板f(t); a、 模板f(t); a、 f(t); a、 f(t); a、 f(t); }
至少在MSVC2010下,上述代码编译良好 在所有呼叫A.f的方式中,有没有什么优先的方法C++ 调用模板函数的常规方法 结构A { 样板 空f(U) { } }; 样板 空隙f(T) { A A; a、 模板f(t); a、 模板f(t); a、 f(t); a、 f(t); a、 f(t); },c++,templates,C++,Templates,至少在MSVC2010下,上述代码编译良好 在所有呼叫A.f的方式中,有没有什么优先的方法 有什么不同吗?最后一个似乎最容易写 否则就没有区别了,除非你必须消除几个f之间的歧义 最后一个似乎最容易写 否则就没有区别了,除非你必须消除几个f之间的歧义 那么,a有类型a,在这种上下文中它不是依赖类型。因此,模板关键字是不需要的,它只用于混淆代码——不要使用它 调用模板而不提供任何参数的版本同样不会改变行为,只会降低代码的可读性——也不要使用它 在剩下的两个候选者之间,a.f(t)和a.f(t),在大
有什么不同吗?最后一个似乎最容易写
否则就没有区别了,除非你必须消除几个f之间的歧义 最后一个似乎最容易写
否则就没有区别了,除非你必须消除几个f之间的歧义 那么,
a
有类型a
,在这种上下文中它不是依赖类型。因此,模板
关键字是不需要的,它只用于混淆代码——不要使用它
调用模板而不提供任何参数的版本同样不会改变行为,只会降低代码的可读性——也不要使用它
在剩下的两个候选者之间,
a.f(t)
和a.f(t)
,在大多数情况下使用第一个,如果编译器无法推断类型,则使用第二个。那么,a
具有类型a
,在这种上下文中它不是依赖类型。因此,模板
关键字是不需要的,它只用于混淆代码——不要使用它
调用模板而不提供任何参数的版本同样不会改变行为,只会降低代码的可读性——也不要使用它
在剩下的两个候选项,
a.f(t)
和a.f(t)
之间,在大多数情况下使用第一个,如果编译器无法推断类型,则使用第二个。没有任何差异。如果您没有任何理由向函数提供类型信息,那么最后一个是最好的。但您可能希望函数将参数当作指定类型来处理,只有在需要时才这样做。比如说
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);
}
如果调用Divide(5,2),则得到2。只有在这种情况下,才应指定类型:
T Divide(T a, T b)
{
return a/b;
}
Divide(5,2);
它返回2.5。完全没有差异。如果您没有任何理由向函数提供类型信息,那么最后一个是最好的。但您可能希望函数将参数当作指定类型来处理,只有在需要时才这样做。比如说
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);
}
如果调用Divide(5,2),则得到2。只有在这种情况下,才应指定类型:
T Divide(T a, T b)
{
return a/b;
}
Divide(5,2);
它返回2.5。如果我改为A,则第一个调用将变得更可取?@Guillaume07:不可取,但必要(如果显式提供了模板参数)。否则编译器将解析a.fIf,如果我有一个a,则第一个调用将变得更可取?@Guillaume07:不可取,但必要(如果显式提供了模板参数)。否则编译器将解析a.f