有问题(是的,我有问题)...使用模板方法。在下面的例子中我有一个模板方法DoIt,实际的代码片段工作正常。模板方法知道传递的缓冲区的实际大小(N)。但我也想要能够调用DoIt只传递缓冲区地址和长度的选项。这是我的方法DoItThisWay。
如何将DoItThisWay调用DoIt,以限制DoIt识别的缓冲区大小,因为只有长度siz,传递给DoItThisWay?
template<typename T, size_t N> size_t DoIt(T(&buf)[N], size_t siz)
{
// Work done here...
return 0;
}
size_t DoItThisWay(uint8_t buf[], size_t siz)
{
return DoIt.........
}
答案 0 :(得分:2)
在函数参数中,uint8_t buf[]
只是uint8_t *buf
的语法糖。
您无法传递原始指针,其中需要引用固定数组。即使可以,也不能将siz
之类的运行时值传递给模板参数,只能传递编译时已知的常量。因此,DoItThisWay
根本无法调用DoIt
。
但是,固定数组会衰减为指向其第一个元素的指针,因此DoIt
可以调用DoItThisWay
,但仅当T
为uint8_t
时才会调用T
1}}冗余(除非您针对不同的数据类型有多个DoItThisWay
重载,或者提供DoItThisWay
它自己的T
模板参数。)
无论哪种方式,siz
的{{1}}参数都是多余的,应该删除,因为DoIt
可以使用DoIt
。
试试这个:
N
或者
size_t DoItThisWay(uint8_t *buf, size_t siz)
{
// Work done here...
return 0;
}
template<size_t N>
size_t DoIt(uint8_t(&buf)[N])
{
return DoItThisWay(buf, N);
}
或者
size_t DoItThisWay(uint8_t *buf, size_t siz)
{
// Work done here...
return 0;
}
// other overloads of DoItThisWay...
template<typename T, size_t N>
size_t DoIt(T(&buf)[N])
{
return DoItThisWay(buf, N);
}
答案 1 :(得分:1)
没有好方法从DoIt
调用DoItThisWay
,因为它只知道编译时的类型而不是大小。您需要同时致电DoIt
。
size_t DoItThisWay(uint8_t buf[], size_t siz)
{
// What value of N can you use here?
return DoIt.........
}
BTW,将siz
传递给DoIt
是多余的。你已经知道了尺寸。它是N
。