我目前正在使用C / C ++ MATLAB API,并且我尝试使用可变参数模板函数;我对它不是很熟悉。它将有效地将数据结构列表输出到MATLAB结构中。
编译时,我收到以下2个错误:
matLink :: output2':找不到匹配的重载函数
' void matLink :: output2(mxArray *,int,const char **,const currentData&,const restData& ...)':需要5个参数 - 提供3个
template<typename... Data>
void matLink::output(const char* file, const char* varName, const char** label, const Data&... data) {
mxArray * pStruct;
// do some stuff...
output2(pStruct, 0, label, data...); // start recursion
// some more
}
template<typename currentData, typename... restData>
void matLink::output2(mxArray* pStruct, int index, const char** label, const currentData& current, const restData&... rest) {
matWrite(pStruct, current, label[index], index);
output2(pStruct, ++index, label, rest...); // both errors at this line
}
template<typename lastData>
void matLink::output2(mxArray* pStruct, int index, const char** label, const lastData& last) {
// base case
output2(pStruct, last, label[index], index);
}
我该如何解决这个问题?
答案 0 :(得分:0)
看看这样的事情是否有帮助:
template<typename... Data>
struct OutputHelper {
static void output(mxArray* pStruct, int index, const char** label, const Data& ...) {
// Do nothing. We'll only get here when `Data` is empty
}
};
template<typename First, typename... Rest>
struct OutputHelper<First, Rest...> {
static void output(mxArray* pStruct, int index, const char** label,
const First& first, const Rest& rest...) {
matWrite(pStruct, first, label[index], index);
OutputHelper<Rest...>::output(pStruct, index+1, label, rest...);
}
};
template<typename... Data>
void matLink::output(const char* file, const char* varName, const char** label,
const Data&... data) {
mxArray * pStruct;
OutputHelper<Data...>::output(pStruct, 0, label, data...); // start recursion
}
与功能模板不同,类模板支持部分特化。因此,通过类模板路由递归很方便 - 当部分特化可用时,更容易制定特殊情况。
答案 1 :(得分:0)
实际上,仔细观察后,更简单的事情应该起作用:
template<typename... Data>
void matLink::output(const char* file, const char* varName, const char** label,
const Data&... data) {
mxArray * pStruct;
int index = 0;
auto dummy = {(matWrite(pStruct, data, label[index], index), index++)...};
}
这利用了以下事实:a)参数包上的表达式可以在初始化列表中扩展,b)这样的列表中的各个初始化器保证按顺序从左到右执行。