我什么时候需要指定模板的类型
When do I need to specify the type a template
我编写了一个简单的模板来查找参数列表中的最小数字。
template<typename T>
T smallerList(T a, T b) {
std::cout << "a= " << a << " b= " << b << std::endl;
return a < b ? a : b;
}
template<typename T, typename... Rest>
T smallerList(const T& param0, const Rest&... rest) {
T temp = smallerList(rest...);
return param0 < temp ? param0 : temp;
}
int main()
{
// Works, returns "3"
std::cout << "Smaller: " << smallerList(4, 5, 6, 3, 7) << std::endl;
// Sort of works, returns "2". Should be "2.14".
std::cout << "Smaller: " << smallerList(3.14, 43534, 100.2, 3.13, 2.14) << std::endl;
}
由于某种原因,第二个函数调用返回2而不是2.14。为什么会发生这种情况?
我已经打印了变量的中间值,它们是正确的。当smallerList返回时,似乎发生了隐式转换。
我可以通过更改线路来解决这个问题
T temp = smallerList(rest...);
进入
T temp = smallerList<T>(rest...);
此更改后,功能将按预期打印2.14。
我的问题是:为什么我需要指定类型?我认为模板函数是为每个被调用的类型"创建"的吗?
好吧,我不知道如何真正帮助你,因为我不知道你想要什么样的逻辑。但在可变模板中,您允许类型混合,在第二个向量中,您传递一个整数43534
,因此当2.14
反向传播时,递归回滚时,您会得到类似的东西
return (int)(43534 < 2.14? 43534 : 2.14);
因为43534
将是param0
,并且返回类型为param0
,2.14
将转换为2
。接下来,它被转换回float
,但你看不到它
您要么需要检查参数的类型是否相同,要么想出一些逻辑来提升您的参数。并不是说如果你使用43534.0
,它会像你期望的那样工作,因为它不再是int
了。
编辑:
T temp = smallerList<T>(rest...);
这并不能真正帮助您,它改变了行为,迫使每个参数的类型转换为第一个参数的类型。它变得更加一致。但是尝试一下:
smallerList(7, 10.5, 10, 3.13, 2.14)
它会碎的。我不能100%确定原因,但我想它不能匹配递归的末尾,因为它会查找smallerList(int, float)
,而您的终止符模板不匹配。
你需要这样的东西:
template<typename T, typename U>
T smallerList(T a, U b) {
std::cout << "a= " << a << " b= " << b << std::endl;
return a < b ? a : b;
}
它还丢弃了第二个类型,所以您将进行类型转换,但如果您的目标是保持第一个参数的类型,那么它是一致的。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 您应该在什么时候创建自己的异常类型
- 如果绝对没有调用成员函数,是否允许使用不完整类型的向量?如果是这样,从什么时候开始
- 由放置新创建的平凡类型的生存期从什么时候开始?
- 什么时候可以将"typename"与明确引用类型的标识符一起使用?
- 我什么时候需要指定模板的类型
- 什么时候应该使用 decltype(x) 而不是 auto 来声明变量的类型
- C - 我应该接受哪种类型的参数?(我们什么时候应该铸造?)
- 派生类型的dynamic_cast "this":什么时候合法?
- 我们什么时候可以省略 C++11 lambda 中的返回类型
- "unsigned"可以使用哪些类型?什么时候需要"signed"?
- malloc 分配的内存在什么时候获得类型
- 什么时候不能用“类”代替“类型名”
- 什么时候应该使用c++ 14自动返回类型扣除
- 当不同类型的整型操作数的==运算符的值为true时,我什么时候才能确定这些操作数是真正相等的
- 新关键字"auto" ;什么时候应该使用它来声明变量类型?
- 我应该什么时候传递"T* const&"类型的指针?