如何转换模板中的#define(可变参数?)

How to convert a #define in a template (variadic?)

我有两个宏,我想在 C++ 模板中转换它们。我在理解如何转换它们时遇到问题。

下面是两个宏:

#define __MATRIX_GETVALUE(C,T,val,dim0...) \
    va_list vl; \
    va_start(vl,dim0); \
    C->setPositions(vl,dim0); va_end(vl);\
    val = *((T *)(m_values)+posInValueVector())

#define __MATRIX_SETVALUE(C,T,val,dim0...) \
    va_list vl; \
    va_start(vl,dim0); \
    C->setPositions(vl,dim0); va_end(vl);\
    *((T *)(m_values)+posInValueVector())=val

以上两个宏是我第一个 to this .

软件中用到的

使用 C++11 和可变参数模板,您可以轻松获得 n 维矩阵,例如:

template<typename T, int ...rest>
struct matrix;

template<typename T, int n>
struct matrix<T, n> {
    T data[n];
    matrix() {
        for (int i=0; i<n; i++) {
            data[i] = T(0);
        }
    }
    T& operator[](int index) { return data[index]; }
};

template<typename T, int n, int ...rest>
struct matrix<T, n, rest...> {
    matrix<T, rest...> data[n];
    matrix<T, rest...>& operator[](int index) { return data[index]; }
};

可用于:

matrix<double, 10, 9, 4> m;
for (int i=0; i<10; i++) {
    for (int j=0; j<9; j++) {
        for (int k=0; k<4; k++) {
            m[i][j][k] = i + j*2.718 + k*3.1416;
        }
    }
}

没有你现在拥有的可怕宏的问题:

  • 保留名称
  • 常规名称注入
  • 参数的多重评估
  • 可变参数 C 函数调用
  • 使用矩阵对象状态 "current position"