解决
我正在编写一个处理struct bwords的现有lib的接口(参见下面的代码),并希望能够在bword本身或字符串(bword成员)上调用一些检查函数。 :
#include <cstdio>
typedef unsigned char byte;
typedef unsigned short ushort;
typedef struct bwordSt { ushort nbLetters; byte *L; } bword;
template<typename T, size_t N>
ushort checkBwL(T (&wL)[N], ushort wSz) {
return 0;
}
ushort checkBwL(const byte* const &wL, ushort wSz) {
return 0;
}
ushort checkBw(const bword &bw) {
return checkBwL(bw.L, bw.nbLetters);
}
int main() {
ushort n;
byte fL[2] = {0, 1};
n = checkBwL(fL, 2); // calls the template function
bword bW = {2, new byte[3]};
bW.L[0] = 0; bW.L[1] = 1; bW.L[2] = 2;
n = checkBwL(bW.L, 3); // calls the non-template function
n = checkBw(bW); // calls the non-template function
return n;
}
字节串可能很大,所以我想通过引用传递。我做到了。
我发现提供统一接口的唯一方法是复制模板中的基本检查函数(checkBwL)的代码(对于数组[byte])和重载(对于byte *),这是丑陋的力量我保持两个基本相同(大)的功能。
有什么方法吗?
解
不需要模板功能,只是不要忘记参数规范const
中&
之前的const byte* const &wL
答案 0 :(得分:1)
成功的关键是授权:
#include <cstdio>
typedef unsigned char byte;
typedef unsigned short ushort;
typedef struct bwordSt { ushort nbLetters; byte *L; } bword;
ushort check_impl(ushort length, const byte* buffer)
{
// do your actual checking here
return 0;
}
template<typename T, size_t N>
auto checkBw(T (&wL)[N], ushort wSz) -> ushort
{
return wSz == (N * sizeof(T)) && // assuming no null terminator
check_impl(wSz, reinterpret_cast<const byte*>(wL));
}
ushort checkBw(const byte* const &wL, ushort wSz) {
return check_impl(wSz, wL);
}
ushort checkBw(const bword &bw) {
return check_impl(bw.nbLetters, bw.L);
}
int main() {
ushort n;
byte fL[2] = {0, 1};
n = checkBw(fL, 2); // calls the template function
bword bW = {2, new byte[3]};
bW.L[0] = 0; bW.L[1] = 1; bW.L[2] = 2;
n = checkBw(bW.L, 3); // calls the non-template function
n = checkBw(bW); // calls the non-template function
return n;
}