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);

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

发布了106 篇原创文章 · 获赞 2 · 访问量 3万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 岁月 设计师: pinMode

分享到微信朋友圈

×

扫一扫,手机浏览