我正在编写一个模板化的GPGPU张量和函数(主要是出于娱乐目的,也是为了进一步理解模板元编程和GPGPU编程),并且我想做一些静态断言以防止对该函数的无效使用。

C++ AMP array_view类的要求之一是它是矩形的(即所有范围都相同)。

但是,我不确定如何执行此操作。目前,我的函数如下所示:

template <typename T, typename U>
auto TensorSum( T t, U u )->decltype( std::remove_all_extents<T>::type + std::remove_all_extents<U>::type )
{
    using SumType = decltype(std::remove_all_extents<T>::type + std::remove_all_extents<U>::type);

    static_assert( std::rank<T>::value == std::rank<U>::value, "The two tensors must have the same rank" );

    // ToDo: Put a static assertion here to ensure tensors are rectangular

    SumType arrSum[std::rank<T>::value * std::extent<U>::value];

    concurrency::array_view<std::remove_all_extents<T>::type, std::rank<T>::value> a( std::extent<T>::value, t );
}

我的主要问题是等级是一个变量,没有办法在编译时执行迭代。

最佳答案

做到这一点的唯一方法是也使类模板的值(我使用了另一个示例)

template <typename T, typename U, T t, U u>
void blah()
{
  static_assert(t==u,"sizes must be equal");
  printf("foo");
}
int main()
{
  blah<int,int,10,10>();
  //blah<int,int,10,15>();error C2338 (Visual Studio): "sizes must be equal"
}

我最近以这种方式制作了一个矩阵类:
template <size_t M,size_t N>
class Matrix
{
    double values_[M][N];
    ...

};

而不是运营商像这样工作:
 template <size_t M, size_t N>
 operator +(const Matrix<M,N>& lhs,const Matrix<M,N>& rhs){...}

因为大小是类型的一部分,所以使运算符(operator)仅适用于此类有效情况变得容易。但是,替代方法是:
 template <size_t ML, size_t NL,size_t MR,size_t NR>
 operator +(const Matrix<ML,NL>& lhs,const Matrix<MR,NR>& rhs)
 {
    static_assert(ML==MR && NL==NR,"Matrix dimensions must aggree");
     ...
 }

两种方法都可以,但是如果不将大小与某种模板参数关联,则只能进行运行时检查(AKA异常处理)。

关于c++ - 在编译时检查张量是否为矩形(即多维数组的所有范围都相等),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17929409/

10-11 18:03