C++ 模板是令人费解的。。。需要帮助(除美沙酮外)
有问题(是的,好吧,我有问题)。。。使用模板方法。在下面的示例中,我有一个模板方法DoIt,实际的代码可以正常工作。模板方法知道要传递的缓冲区的实际大小(N)。但我也希望能够调用DoIt(只传递缓冲区地址和长度)。这是我用这种方法做的 我如何让DoItThisWay调用DoIt来限制DoIt识别的缓冲区的大小,因为它只具有length siz,传递给DoItThisWayC++ 模板是令人费解的。。。需要帮助(除美沙酮外),c++,templates,C++,Templates,有问题(是的,好吧,我有问题)。。。使用模板方法。在下面的示例中,我有一个模板方法DoIt,实际的代码可以正常工作。模板方法知道要传递的缓冲区的实际大小(N)。但我也希望能够调用DoIt(只传递缓冲区地址和长度)。这是我用这种方法做的 我如何让DoItThisWay调用DoIt来限制DoIt识别的缓冲区的大小,因为它只具有length siz,传递给DoItThisWay template<typename T, size_t N> size_t DoIt(T(&buf)[N
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.........
}
template size\u t DoIt(t(&buf)[N],size\t siz)
{
//在这里完成的工作。。。
返回0;
}
这种方式的尺寸(uint8尺寸[],尺寸大小)
{
返回DoIt。。。。。。。。。
}
从DoItThisWay
调用DoIt
没有好方法,因为它在编译时只知道类型,不知道大小。您需要同时调用DoIt
size_t DoItThisWay(uint8_t buf[], size_t siz)
{
// What value of N can you use here?
return DoIt.........
}
顺便说一句,将siz
传递到DoIt
是多余的。你已经知道尺寸了。它是N
从DoItThisWay
调用DoIt
没有好方法,因为它在编译时只知道类型,不知道大小。您需要同时调用DoIt
size_t DoItThisWay(uint8_t buf[], size_t siz)
{
// What value of N can you use here?
return DoIt.........
}
顺便说一句,将siz
传递到DoIt
是多余的。你已经知道尺寸了。在函数参数中,uint8\u t buf[]
只是uint8\u t*buf
的语法糖
无法在需要对固定数组进行引用的位置传递原始指针。即使可以,也不能将运行时值(如siz
)传递给模板参数,而只能传递编译时已知的常量。因此,DoIt这种方式
根本无法调用DoIt
size_t DoItThisWay(uint8_t buf[], size_t siz)
{
// What value of N can you use here?
return DoIt.........
}
但是,固定数组衰减为指向其第一个元素的指针,因此DoIt
可以调用DoItThisWay
,但只有当T
为uint8\T
时,才能调用T
,从而使T
冗余(除非您对不同的数据类型有多个DoItThisWay
重载,或者给出DoItThisWay
它自己的T
模板参数)
无论哪种方式,DoIt
的siz
参数都是多余的,应该删除,因为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\u t DoItThisWay(uint8\u t*buf,size\u t siz)
{
//在这里完成的工作。。。
返回0;
}
模板
尺寸(单位8&buf)[N])
{
返回此路径(buf,N);
}
或
size\u t DoItThisWay(uint8\u t*buf,size\u t siz)
{
//在这里完成的工作。。。
返回0;
}
//DoItThisWay的其他重载。。。
模板
尺寸(t&buf)[N])
{
返回此路径(buf,N);
}
或
模板
这种方式的尺寸(t*buf,尺寸大小)
{
//在这里完成的工作。。。
返回0;
}
模板
尺寸(t&buf)[N])
{
返回此路径(buf,N);
}
在函数参数中,uint8\u t buf[]
只是uint8\u t*buf
的语法糖
无法在需要对固定数组进行引用的位置传递原始指针。即使可以,也无法将运行时值(如siz
)传递给模板参数,而只能传递编译时已知的常量。因此,DoItThisWay
无法调用DoIt
size_t DoItThisWay(uint8_t buf[], size_t siz)
{
// What value of N can you use here?
return DoIt.........
}
但是,固定数组衰减为指向其第一个元素的指针,因此DoIt
可以调用DoItThisWay
,但只有当T
为uint8\T
时,才能调用T
,从而使T
冗余(除非您对不同的数据类型有多个DoItThisWay
重载,或者给出DoItThisWay
它自己的T
模板参数)
无论哪种方式,DoIt
的siz
参数都是多余的,应该删除,因为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\u t DoItThisWay(uint8\u t*buf,size\u t siz)
{
//在这里完成的工作。。。
返回0;
}
模板
尺寸(单位8&buf)[N])
{
返回此路径(buf,N);
}
或
size\u t DoItThisWay(uint8\u t*buf,size\u t siz)
{
//在这里完成的工作。。。
返回0;
}
//DoItThisWay的其他重载。。。
模板
尺寸(t&buf)[N])
{
返回此路径(buf,N);
}
或
模板
这种方式的尺寸(t*buf,尺寸大小)
{
//在这里完成的工作。。。
返回0;
}
模板
尺寸(t&buf)[N])
{
返回此路径(buf,N);
}
为什么不换一种方式来做呢,然后用DoIt
调用DoItThisWay(buf,siz)
?我想了想,实际上正打算这么做,但后来我想我剪掉了老虎的尾巴,问论坛是否有答案?说真的,不修改原始代码以插入新的呼叫重载是很好的。顺便问一下!为什么你既有N
又有siz
它们有不同的含义,那么只有其中一个的第二个函数与它有什么关系呢?为什么不换个方式,调用DoItDoItThisWay(buf,siz)
?我想了想,实际上正打算这么做,但后来我想我剪掉了老虎的尾巴,问论坛是否有答案?说真的,不修改原始代码以插入新的呼叫重载是很好的。顺便问一下!为什么你既有N
又有siz
它们有不同的含义,那么第二个函数只有两个函数中的一个与之相关。顺便说一句,试图用真实世界的代码来做一个例子是危险的。但是我很欣赏你的评论。我明白你的观点,尽管令人失望。我希望插入一个简单的重载,而不必修改原始的。时间对于一个吹毛求疵的人来说,消除撅嘴的感觉。顺便说一句,你是试图用真实世界的代码做一个例子的危险之一。但是我很欣赏你的评论。我明白了