调用模板函数的常规方法
Conventional way for calling a template function
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
的方式中,有什么优惠的方式可以做到这一点吗?
有什么区别吗?
好吧,a
有类型 A
,在这种情况下它不是依赖类型。 所以 template
关键字不是必需的,它仅用于混淆代码——不要使用它。
在不提供任何参数的情况下调用模板的版本同样不会改变行为,只会降低代码的可读性 - 也不要使用它。
在剩下的两个候选项(a.f(t)
和 a.f<int>(t)
之间,在大多数情况下使用第一个,如果编译器无法推断类型,则使用第二个。
最后一个似乎最容易写。
否则没有区别,除非你必须在几个f之间消除歧义。
完全没有区别。如果您没有任何理由向函数提供类型信息,则最后一个是最好的。但是,您可能希望函数像处理指定类型一样处理参数,只有这样,您才需要<>。例如
T Divide(T a, T b)
{
return a/b;
}
如果你调用除法(5,2(,你会得到2。只有这样的情况,才应该指定类型:
Divide<float>(5,2);
它返回 2.5。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 是否有任何常规方法可以通知 STL 移动和复制构造函数?
- C++:有哪些常规方法可以使代码更有效地用于大数字
- C++中的错误处理,构造函数与常规方法
- COM属性方法和常规接口方法之间的区别是什么
- 没有标准的方法来比较智能指针和常规指针
- 调用模板函数的常规方法
- 从std::find_if等方法返回的迭代器与常规迭代器不匹配