テンプレート化された GPGPU tensor sum 関数を作成しています (主に楽しみのためですが、テンプレートのメタプログラミングと GPGPU プログラミングの理解を深めるためにも)、関数の無効な使用を防ぐためにいくつかの静的アサーションを実行したいと考えています。
C++ AMParray_view
クラスの要件の 1 つは、それが長方形であることです (つまり、すべての範囲が同じです)。
ただし、これを行う方法が完全にはわかりません。現在、私の関数は次のようになります。
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 );
}
私の主な問題は、ランクが変数であり、コンパイル時に反復を実行する方法がないことです。