调用模板函数的常规方法

Conventional way for calling a template function

本文关键字:常规 方法 函数 调用      更新时间:2023-10-16
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。