模板是心灵弯曲......需要帮助(美沙酮除外)

时间:2018-06-08 04:51:42

标签: c++ templates

有问题(是的,我有问题)...使用模板方法。在下面的例子中我有一个模板方法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.........
}

2 个答案:

答案 0 :(得分:2)

在函数参数中,uint8_t buf[]只是uint8_t *buf的语法糖。

您无法传递原始指针,其中需要引用固定数组。即使可以,也不能将siz之类的运行时值传递给模板参数,只能传递编译时已知的常量。因此,DoItThisWay根本无法调用DoIt

但是,固定数组会衰减为指向其第一个元素的指针,因此DoIt可以调用DoItThisWay,但仅当Tuint8_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