调用模板函数的常规方法

时间:2012-02-04 14:55:51

标签: c++ templates

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的所有方式中,是否有任何优惠方式可以做到这一点?

有什么不同吗?

3 个答案:

答案 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。