问题
I've two macros and I desire to convert them in C++ templates. I've problems in understendig how to convert them.
Here are the two macros:
#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
The two macros above are used in the software in my first answer to this question.
回答1:
With C++11 and variadic template you can get n-dimensional matrices easily with for example:
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]; }
};
that can be used with:
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;
}
}
}
without the problems of the horrible macros you have now:
- reserved names
- regular names injection
- multiple evaluation of arguments
- variadic C function calls
- use of matrix object state for "current position"
来源:https://stackoverflow.com/questions/30010444/how-to-convert-a-define-in-a-template-variadic