C++ 模板是令人费解的。。。需要帮助(除美沙酮外)

C++ 模板是令人费解的。。。需要帮助(除美沙酮外),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

有问题(是的,好吧,我有问题)。。。使用模板方法。在下面的示例中,我有一个模板方法DoIt,实际的代码可以正常工作。模板方法知道要传递的缓冲区的实际大小(N)。但我也希望能够调用DoIt(只传递缓冲区地址和长度)。这是我用这种方法做的

我如何让DoItThisWay调用DoIt来限制DoIt识别的缓冲区的大小,因为它只具有length 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.........
}
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
它们有不同的含义,那么只有其中一个的第二个函数与它有什么关系呢?为什么不换个方式,调用
DoIt
DoItThisWay(buf,siz)
?我想了想,实际上正打算这么做,但后来我想我剪掉了老虎的尾巴,问论坛是否有答案?说真的,不修改原始代码以插入新的呼叫重载是很好的。顺便问一下!为什么你既有
N
又有
siz
它们有不同的含义,那么第二个函数只有两个函数中的一个与之相关。顺便说一句,试图用真实世界的代码来做一个例子是危险的。但是我很欣赏你的评论。我明白你的观点,尽管令人失望。我希望插入一个简单的重载,而不必修改原始的。时间对于一个吹毛求疵的人来说,消除撅嘴的感觉。顺便说一句,你是试图用真实世界的代码做一个例子的危险之一。但是我很欣赏你的评论。我明白了