如何组合两个仅在声明的类型上不同的函数
How can I combine two functions that differ only in the types declared
我正在编写一个 mex 函数来从 FLI 相机抓取图像。图像可以具有不同的位深度(8 位或 16 位),因此我不得不编写两个函数,它们仅在声明的类型上有所不同。我的问题:如何组合以下功能以消除尽可能多的代码重复?
mxArray* grabFrame16Bit(flidev_t device, long imageWidth, long imageHeight) {
long imageSize = imageWidth*imageHeight;
uint16_t *image = (uint16_t *) mxCalloc(imageSize, sizeof(uint16_t));
int iRow, ind;
for (iRow = 0; iRow < imageHeight; iRow++) {
ind = iRow*imageWidth;
fli::checkReturn(FLIGrabRow(device, image+ind, imageWidth),
"fliTestSnapMex:FLIGrabRow");
}
mxArray *outMat = mxCreateDoubleMatrix(imageWidth, imageHeight, mxREAL);
double *imageOut = mxGetPr(outMat);
int i;
for (i = 0; i < imageSize; i++)
imageOut[i] = (double) image[i];
mxFree(image);
image = NULL;
return outMat;
}
mxArray* grabFrame8Bit(flidev_t device, long imageWidth, long imageHeight) {
long imageSize = imageWidth*imageHeight;
uint8_t *image = (uint8_t *) mxCalloc(imageSize, sizeof(uint8_t));
int iRow, ind;
for (iRow = 0; iRow < imageHeight; iRow++) {
ind = iRow*imageWidth;
fli::checkReturn(FLIGrabRow(device, image+ind, imageWidth),
"fliTestSnapMex:FLIGrabRow"); }
mxArray *outMat = mxCreateDoubleMatrix(imageWidth, imageHeight, mxREAL);
double *imageOut = mxGetPr(outMat);
int i;
for (i = 0; i < imageSize; i++)
imageOut[i] = (double) image[i];
mxFree(image);
image = NULL;
return outMat;
}
这里声明了我编写的一个自定义函数以及其他 API 函数,以防您不熟悉 FLI API 或 MATLAB mex/mx API。
// allocates memory
void *mxCalloc(mwSize n, mwSize size);
// checks for an error
void fli::checkReturn(long returnCode, char * errorId);
// grabs a row of the image
long FLIGrabRow(flidev_t device, void * buffer, size_t width);
// creates a double matrix
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity complexFlag);
// gives a pointer to the data in the matrix
double *mxGetPr(const mxArray *pm);
欢迎来到模板的世界!
一种天真的方法是只替换一个类型的所有匹配项,并将其替换为模板类型参数。
template <class T>
mxArray* grabFrame(flidev_t device, long imageWidth, long imageHeight) {
long imageSize = imageWidth*imageHeight;
T *image = (T*) mxCalloc(imageSize, sizeof(T));
int iRow, ind;
for (iRow = 0; iRow < imageHeight; iRow++) {
ind = iRow*imageWidth;
fli::checkReturn(FLIGrabRow(device, image+ind, imageWidth),
"fliTestSnapMex:FLIGrabRow");
}
mxArray *outMat = mxCreateDoubleMatrix(imageWidth, imageHeight, mxREAL);
double *imageOut = mxGetPr(outMat[0]);
int i;
for (i = 0; i < imageSize; i++)
imageOut[i] = (double) image[i];
mxFree(image);
image = NULL;
return outMat;
}
由于模板参数的类型无法从函数参数中推断出来,因此必须在每次调用时显式指定它:
mxArray* array = grabFrame<uint8_t>(device, width, height);
编辑:你的代码没有 return 语句,所以我允许自己添加它。
template<typename PixelType>
mxArray* grabFrame(flidev_t device, long imageWidth, long imageHeight) {
long imageSize = imageWidth*imageHeight;
PixelType *image = (PixelType *) mxCalloc(imageSize, sizeof(PixelType));
int iRow, ind;
for (iRow = 0; iRow < imageHeight; iRow++) {
ind = iRow*imageWidth;
fli::checkReturn(FLIGrabRow(device, image+ind, imageWidth),
"fliTestSnapMex:FLIGrabRow");
}
mxArray *outMat = mxCreateDoubleMatrix(imageWidth, imageHeight, mxREAL);
double *imageOut = mxGetPr(outMat[0]);
int i;
for (i = 0; i < imageSize; i++)
imageOut[i] = (double) image[i];
mxFree(image);
image = NULL;
}
电话会议
grabFrame<uint8_t>(....)
或
grabFrame<uint16_t>(...)
相关文章:
- std::enable_if 更改成员 *变量* 声明/类型
- 对前向声明类型进行unique_ptr的解决方法
- 如何将声明类型作为参数发送
- 在 Fortran 中泛化特定声明类型的操作
- 使用 (c++11) 声明类型时放置 __declspec(dllimport) 关键字的位置
- 模板函数可以使用带有删除的构造函数的声明类型
- 声明类型没有任何可变类型
- 如何使用声明类型简化此代码
- 使用声明类型选择函数专业化
- 替代班级内声明类型的别名
- 对于自动键入推论的参数,声明类型(自动)应推导的内容
- 使用 decltype 的条件声明类型
- 您如何声明类型结构的堆栈?在C 中
- 将指向前向声明类型的指针推送到 typedef'd 向量时出现编译器错误
- 声明适用于 auto,但不能显式声明类型?
- 声明类型包含未展开的参数包'Args'
- 课堂上的Typedef.在另一个类错误中:尚未声明类型
- 冲突的声明类型/价值不匹配
- 获取具有AST访问者clang的功能声明类型
- 变量声明类型定义 C 中的约定