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

时间:2017-07-23 18:41:47

标签: c++ templates variadic-templates

我目前正在使用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);
}

我该如何解决这个问题?

2 个答案:

答案 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++)...};
}

Demo

这利用了以下事实:a)参数包上的表达式可以在初始化列表中扩展,b)这样的列表中的各个初始化器保证按顺序从左到右执行。