我正在编写一个模板化的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/