如何在模板中转换#Define(variadic?)

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

本文关键字:#Define variadic 转换      更新时间:2023-10-16

我有两个宏,我希望在C 模板中转换它们。我在Letterendig中如何转换它们。

这是两个宏:

#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

在我对此问题的第一个回答中,上面的两个宏都使用了该软件。

带有C 11和variadic模板,您可以轻松获得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;
        }
    }
}

没有您现在遇到的可怕宏的问题:

  • 保留名称
  • 常规名称注入
  • 参数的多次评估
  • variadic C函数调用
  • 将矩阵对象状态用于"当前位置"