可以在C ++中的函数模板中转换参数吗?

时间:2015-05-06 02:33:23

标签: c++ templates

例如,我有一个功能模板:

template<typename T> void foo(T a, T b, T &c);

如果我将int, double, double传递给它,该怎么办?在Xcode中,它报告错误。那么这是否意味着我不能为一种模板类型传递不同类型的参数?

在另一种情况下,如果我拨打foo<double>(double, int, int),则表示错误。但foo<int>(double, int, int)会好的。此问题是否与引用类型有关?

3 个答案:

答案 0 :(得分:3)

如果没有明确指定类型,则无法传递不同的类型。模板是强类型的,如果类型不完全匹配,类型扣除将失败。

在第一个示例中,您指定了模板类型,因此使用double

明确地实例化模板
foo<double>(T, T, T&)

所以函数作为参数(double, double, double&)。该示例不起作用,因为编译器执行基本类型引用的类型转换(即,int n; double& c = n;或其他方式是非法的),并且您是传递int作为最后一个参数,该参数无法绑定到double&引用。

第二个例子

foo<int>(T, T, T&)

没关系,您可以显式指定类型,并使用参数(int, int, int&)实例化该函数。现在编译器为第一个参数执行所需的转换(double - 到 - int);没有为参考执行转换。

答案 1 :(得分:0)

不,当然,T不能同时是intdouble。函数参数与您的调用参数不匹配。

答案 2 :(得分:0)

如果模板函数中需要不同的参数类型,请以此为例

template<typename A, typename B, typename C>
void add( A a, B b, C& c ) {
    c = static_cast<C>( a + b );
}

如果您正在使用指向对象的指针的模板类型,那么您可能需要使用dynamic_cast。