Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板递归,参数数量不正确_C++_Templates_Variadic Templates - Fatal编程技术网

C++ 可变模板递归,参数数量不正确

C++ 可变模板递归,参数数量不正确,c++,templates,variadic-templates,C++,Templates,Variadic Templates,我目前正在使用C/C++MatlabAPI,并尝试使用可变模板函数;我对它不太熟悉。它将有效地将数据结构列表输出到MATLAB结构中 编译时,我收到以下两个错误: matLink::output2”:未找到匹配的重载函数 'void matLink::output2(mxArray*,int,const char**,const currentData&,const restData&…):需要5个参数-提供3个 template<typename... Data> void mat

我目前正在使用C/C++MatlabAPI,并尝试使用可变模板函数;我对它不太熟悉。它将有效地将数据结构列表输出到MATLAB结构中

编译时,我收到以下两个错误:

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);
}
模板
void matLink::输出(常量字符*文件、常量字符*变量名、常量字符**标签、常量数据和…数据){
mxArray*pStruct;
//做些事情。。。
输出2(pStruct,0,label,data…)//开始递归
//更多
}
模板
void matLink::output2(mxArray*pStruct、int index、const char**label、const currentData和current、const restData和…rest){
matWrite(pStruct、current、label[索引]、index);
output2(pStruct、++索引、标签、rest…)//此行出现两个错误
}
模板
void matLink::output2(mxArray*pStruct、int索引、const char**label、const lastData和last){
//基本情况
输出2(pStruct、last、标签[索引]、索引);
}

如何修复此问题?

看看这样的方法是否有帮助:

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
}
模板
结构输出帮助器{
静态void输出(mxArray*pStruct、int索引、const char**label、const Data&…){
//什么也不做。我们只有在“数据”为空时才能到达这里
}
};
模板
结构输出帮助器{
静态无效输出(mxArray*pStruct、int index、const char**label、,
常量第一和第一,常量休息和休息…){
matWrite(pStruct,first,label[index],index);
OutputHelper::输出(pStruct、索引+1、标签、rest等);
}
};
模板
void matLink::output(常量字符*文件、常量字符*变量名、常量字符**标签、,
常量数据(&…数据){
mxArray*pStruct;
OutputHelper::输出(pStruct、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++)...};
}
模板
void matLink::output(常量字符*文件、常量字符*变量名、常量字符**标签、,
常量数据(&…数据){
mxArray*pStruct;
int指数=0;
自动虚拟={(matWrite(psstruct,data,label[index],index),index++)…};
}


这利用了以下事实:a)参数包上的表达式可以在初始值设定项列表中展开,b)此类列表中的单个初始值设定项保证按从左到右的顺序执行。

交换
output2
定义的顺序。以输入错误关闭。交换output2函数只会导致相同的错误集,但第二个错误是“…需要4个参数-提供3个”?我早就料到会有错误-4个参数的调用似乎不明确。在这样的调用中,没有理由更喜欢第二个重载而不是第一个重载。另外,您的第二个重载调用
output2
的方式与两个签名都不匹配-应该调用哪个重载?