【发布时间】:2014-08-30 16:28:16
【问题描述】:
我有 Vector (CVector<T, std::size_t Size>)、Matrix (CMatrix<T, std::size_t Height, std::size_t Width>) 和 Tensor (CTensor<T, std::size_t... Sizes>) 类,我希望能够从 CTensor 类隐式转换为 CVector 类,如果 @ 987654326@ 和CMatrix 类如果sizeof...(Sizes) == 2,所以我有以下转换运算符(最初我没有std::enable_if 模板参数,希望我可以使用SFINAE 来防止它编译):
template <typename std::enable_if<sizeof...(Sizes) == 2, int>::type = 0>
operator CMatrix<NumType, Sizes...>() const
{
static_assert(sizeof...(Sizes) == 2, "You can only convert a rank 2 tensor to a matrix");
CMatrix<NumType, Sizes...> matResult;
auto& arrThis = m_numArray;
auto& arrResult = matResult.m_numArray;
concurrency::parallel_for_each( arrResult.extent, [=, &arrThis, &arrResult]( concurrency::index<2> index ) restrict( amp ) {
arrResult[index] = arrThis[index];
} );
return matResult;
}
template <typename std::enable_if<sizeof...(Sizes) == 1, int>::type = 0>
operator CVector<NumType, Sizes...>() const
{
static_assert(sizeof...(Sizes) == 1, "You can only convert a rank 1 tensor to a vector");
CVector<NumType, Sizes...> vecResult;
auto& arrThis = m_numArray;
auto& arrResult = vecResult.m_numArray;
concurrency::parallel_for_each( arrResult.extent, [=, &arrThis, &arrResult]( concurrency::index<1> index ) restrict( amp ) {
arrResult[index] = arrThis[index];
} );
return vecResult;
}
但是,例如,如果我实例化 CTensor<float, 3, 3, 3> 并尝试编译,则会出现错误,声明 CMatrix 和 CVector 的模板参数过多,以及有关 @987654334 缺少类型的错误@。有没有一种方法可以实现这些运算符,而无需专门针对 1 级和 2 级的 CTensor?
【问题讨论】:
-
我真的不知道任何其他方式。试图解决类似的问题并以 base implementation 结束,然后将最终类声明为从基类派生并专门针对其他情况。顺便说一句:为什么不只使用 CTensor 并将其别名为 CVector / CMatrix?无需转换,它们将变得相同。
-
@firda 这不是一个坏主意;我会拭目以待,看看其他人是否有好主意(以帮助防止我不得不重构),如果没有,我肯定会这样做;谢谢!!
-
快速注意,你可以抛出异常,如果你真的不希望它编译你限制自己编译时间的东西,所以不是用户输入。 (张量和向量,我猜你需要用户输入)
标签: c++ templates c++11 sfinae