c++ 模板显示实参 的 参数类型推断

模板显示实参

在某些情况下,编译器无法推断出模板的实参类型。其他一些情况下,我们希望用户控制模板实例化。当函数类型与参数列表中任何类型不同的时候,这两种情况最常出现。

指定显示的模板实参

在某些情况下,编译器无法推断出模板实参的类型。在其他一些情况下,我们希望允许用户控制模板实例化。当函数返回类型和参数列表的任何类型都不同的时候,这两种情况最常出现。

指定显示的模板实参

作为一个允许用户指定使用类型的例子,我们将定义一个名为sum的函数模板,它以接收两种不同类型的参数。我们允许用户指定结果的类型。这样,用户就可以选择合适的精度了。

template <typename T1,typename T2,typename T3>
T1 sum(T2,T3);

在这个例子中,没有任何函数实参类型来判断T1的类型。每次调用sum时候调用者必须为T1提供一个显示模板实参。

我们提供显示模板实参的方式与定义类模板实例的方式不同。显示模板实参在尖括号中给出,位于函数名之后,参数列表之前。

auto val3 = sum<long,long>(i,lng);

此调用显示指定T1的类型。而T2和T3的类型由编译器从i和long的类型来判断。

显示模板实参由左到右的顺序与对应的模板参数匹配;第一个模板实参与第一个模板参数匹配,第二个实参与第二个参数匹配,依次类推。只有尾部参数的显示模板实参才可以或略,而且前提是他们可以从函数参数推断出来。如果我们的sum函数按照如下的形式来编写:

template <typename T1,typename T2,typename T3>  T1 sum(T2 a,T3 b)
{
    return a+b;
}
int main()
{
    auto data = sum<long,long>(1,2);
    auto data2 = sum<long>(1,2);
    return 0;
}

这两种写法都是可以的编译器可以自行推断出返回结果

    string D1("a");
    string D2("n");
    auto data2 = sum<string>(D1,D2);

这些例子告诉我们当我们显示的提供一些模板实参的时候,编译器是具有一定的推断能力的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值