gpt4 book ai didi

c++ - 调用不带 <> 的模板函数;类型推断

转载 作者:可可西里 更新时间:2023-11-01 15:39:55 25 4
gpt4 key购买 nike

如果我有一个带有 typename T 的函数模板,编译器可以在其中自行设置类型,那么在调用函数时就不必显式地编写类型,例如:

template < typename T > 
T min( T v1, T v2 ) {
return ( v1 < v2 ) ? v1: v2;
}
int i1 = 1, i2 = 2; int i3 = min( i1, i2 ); //no explicit <type>

但是如果我有一个带有两个不同类型名称的函数模板,例如:

template < typename TOut, typename TIn >
TOut round( TIn v ) {
return (TOut)( v + 0.5 );
}
double d = 1.54;
int i = round<int>(d); //explicit <int>

我总是必须至少指定 1 个类型名称,这是真的吗?我假设原因是因为 C++ 无法区分不同返回类型之间的函数。

但是如果我使用一个 void 函数并传递一个引用,我又不能显式指定返回类型名:

template < typename TOut, typename TIn > 
void round( TOut & vret, TIn vin ) {
vret = (TOut)(vin + 0.5);
}
double d = 1.54;
int i; round(i, d); //no explicit <int>

结论是否应该是避免使用返回函数,更喜欢在编写模板时通过引用返回的 void 函数?或者是否有可能避免显式写入返回类型?类似于模板的“类型推断”。 C++0x 中是否可以进行“类型推断”?

最佳答案

重载解析仅基于函数参数;根本不使用返回值。如果无法根据参数确定返回类型,则必须明确指定。

我不会走通过引用参数“返回”值的道路;这使得调用代码不清楚。例如,我更喜欢这个:

double x = round<double>(y);

关于这个:

double x;
round(x, y);

因为在后一种情况下,很容易混淆输入和输出,而且一点也不清楚x正在修改中。

round 的特殊情况下,对于 TOut,您可能只需要一种或两种类型无论如何,所以你可以把那个模板参数放在外面:

template<typename TIn>
int roundToInt(TIn v) {
return (int)(v + 0.5);
}

我找到了 roundToInt(x)round<int>(x) 更清楚一点因为很清楚 int 是什么类型用于。

关于c++ - 调用不带 <> 的模板函数;类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2833730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com