模板参数计算

时间:2013-06-27 10:43:21

标签: c++ templates c-preprocessor

(注意:使用没有C ++ 0x标志的GCC 4.6,外部限制。我也对C ++ 11和/或更新的编译器会发生什么感兴趣)

我有一个模板化的类来操作固定大小的矩阵:

template<size_t rows, size_t cols, class Type>
class MatrixFixed;

在该课程中,我定义了一个具有以下方面的“移位”操作:

template<size_t rows, size_t cols, class Type>
template<size_t numRowsUp>
MatrixLogicalFixed<rows,cols,Type> MatrixLogicalFixed<rows,cols,Type>::shiftUp( const Type & filler ) const
{
    if( (numRowsUp>=rows) )
    {
        return MatrixLogicalFixed<rows,cols,Type>(filler);
    }
    else
    {
        MatrixLogicalFixed<numRowsUp,cols,Type> temp(filler);
        return this->getSubMatrix<rows-numRowsUp,cols>( numRowsUp, 0 )
                    .joinV( temp );
    }
}

这个想法是,如果要移位的位置数大于总行数,则可以返回填充了默认值的矩阵。 但是,在这些情况下(numRowsUp >= rows),编译以内部编译器错误结束:在gimplify.c的force_constant_size:691 在最后一个代码行.joinV( temp )

过程中的矩阵大小(我猜):

  • 返回值:(行x列)矩阵
  • getSubMatrix<rows-numRowsUp,cols>( numRowsUp, 0 )numRowsUp>=rows时,由于size_t下溢,这将导致数量巨大
  • joinV函数尝试推导出适当的返回大小,但这是不可能的。

这是joinV声明):

template<size_t rows, size_t cols, class Type>
template<size_t rows2, size_t cols2>
MatrixLogicalFixed<rows+rows2,cols,Type> MatrixLogicalFixed<rows,cols,Type>::joinV(const MatrixLogicalFixed<rows2,cols2,Type> & B) const

由于if条件在编译时定义为 ,因此这是一段代码,在有问题的情况下从不。到目前为止我尝试了什么:

  • 在预处理器中使用模板参数#if - 显然是错误的。
  • 寻找可以解决问题的任何类型的预处理器宏MIN或MAX。

通常的部分特化看起来不像是一个有效的解决方法,因为有无限的值组合......我对任何解决方案都持开放态度。我只想让我的课程编译:D

1 个答案:

答案 0 :(得分:0)

预处理器MAX出了什么问题? 您可以使用MAX(0, rows-numRowsUp)作为模板参数。或者尝试将其作为模板参数:(numRowsUp>=rows)? 0 : rows-numRowsUp。这样,错误的模板永远不会被实现。