如何转换模板中的#define(variadic?) [英] How to convert a #define in a template (variadic?)

查看:181
本文介绍了如何转换模板中的#define(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(v1,dim0); \
C-> setPositions(vl,dim0); va_end(vl); \
*((T *)(m_values)+ posInValueVector())= val


b $ b

上述两个宏在我的第一个 answer 到此

使用C ++ 11和可变参数模板可以很容易地得到n维矩阵,例如:

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

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

模板< 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 < ; k ++){
m [i] [j] [k] = i + j * 2.718 + k * 3.1416;
}
}
}

没有可怕的问题宏:




  • 保留名称

  • 正式名称注入

  • 参数的多重评估

  • 变量C函数调用

  • 对当前位置使用矩阵对象状态


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.

解决方案

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"

这篇关于如何转换模板中的#define(variadic?)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆