程序中写过这样几个函数:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
extractUInt
1
unsigned int extractUInt(byte *element)
2![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
3
byte id = 0;
4
byte *decodedUInt = NULL;
5
unsigned short decodedUIntLength = ElementHandler::decode(element, &id, &decodedUInt);
6
unsigned int ui = 0;
7
memcpy_s(&ui, sizeof(ui), decodedUInt, decodedUIntLength);
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
delete []decodedUInt;
10
return ui;
11
}![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
extractUShort
1
unsigned short extractUShort(byte *element)
2![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
3
byte id = 0;
4
byte *decodedUShort = NULL;
5
unsigned short decodedUShortLength = ElementHandler::decode(element, &id, &decodedUShort);
6
unsigned short us = 0;
7
memcpy_s(&us, sizeof(us), decodedUShort, decodedUShortLength);
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
delete []decodedUShort;
10
return us;
11
}![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
extractByte
1
byte extractByte(byte *element)
2![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
3
byte id = 0;
4
byte *decodedByte = NULL;
5
unsigned short decodedByteLength = ElementHandler::decode(element, &id, &decodedByte);
6
byte by = 0;
7
//memcpy_s(&by, sizeof(by), decodedByte, decodedByteLength);
8
by = *decodedByte;
9![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
delete []decodedByte;
11
return by;
12
}写的时候并未觉得异样,昨天再次查看的时候才发现三个函数语义重复,仅返回值不同,于是想到模板函数。想当然地写成了这样:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1
template<class T>
2
T extractNumber(byte *element)
3![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
4
byte id = 0;
5
byte *decoded = NULL;
6
unsigned short decodedLength = ElementHandler::decode(element, &id, &decoded);
7![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
T t = 0;
9
memcpy_s(&t, sizeof(t), decoded, decodedLength);
10![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
delete []decoded;
12
return t;
13
}编译时未报错,但在调用时
1
unsigned short us = extractNumber(element); 会出现编译错误,提示无法为“T”推导模板参数。改成如下模样即可解决问题:
1
unsigned short us = extractNumber<unsigned short>(element);