是否可以在函数模板中转换参数C++?

Can arguments be converted in function template in C++?

本文关键字:转换 参数 C++ 函数模板 是否      更新时间:2023-10-16

例如,我有一个函数模板:

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)会没事的。此问题是否与引用类型有关?

如果不显式指定类型,则无法传递不同的类型。模板是强类型的,如果类型不匹配,类型推断将失败。

在第一个示例中,您将指定模板类型,因此使用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);没有对引用执行转换。

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

如果您在模板函数中需要不同的参数类型,请使用此参数作为示例

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

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