如何转换模板中的#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"
我有两个宏,我想在 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
以上两个宏是我第一个
使用 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"