张量模板尺寸,模板推导失败 我想在C++中实现张量类,其中张量维度被作为类的模板参数。简单地说,它看起来是这样的: template <size_t... TDims> class Tensor {/*...*/};

张量模板尺寸,模板推导失败 我想在C++中实现张量类,其中张量维度被作为类的模板参数。简单地说,它看起来是这样的: template <size_t... TDims> class Tensor {/*...*/};,c++,templates,C++,Templates,这使得张量和张量实际上是非常相同的类型。我成功地实现了struct removeonsfromend来完成它应该做的事情,但这打开了另一个问题:将Tensor作为函数参数现在可以防止模板参数的推导。例如,使用此矩阵乘法,当给定两个张量时,编译器无法推断三个size\u t值: template <size_t TRows1, size_t TCols1Rows2, size_t TCols2> Tensor<TRows1, TCols2> multiply(Tensor&

这使得
张量
张量
实际上是非常相同的类型。我成功地实现了
struct removeonsfromend
来完成它应该做的事情,但这打开了另一个问题:将
Tensor
作为函数参数现在可以防止模板参数的推导。例如,使用此矩阵乘法,当给定两个张量时,编译器无法推断三个
size\u t
值:

template <size_t TRows1, size_t TCols1Rows2, size_t TCols2>
Tensor<TRows1, TCols2> multiply(Tensor<TRows1, TCols1Rows2> t1, Tensor<TCols1Rows2, TCols2> t2)
{/*...*/}
模板
张量乘(张量t1,张量t2)
{/*...*/}
从理论上讲,
size\t
参数应该具有的值是明确定义的,但是由于
removeonsfromend
添加的间接级别,编译器无法处理它

  • 您知道一种方法可以使
    Tensor
    Tensor
    成为完全相同的类型,同时允许成功的模板参数推导吗
另一种解决方案是让
Tensor
Tensor
继承,直到最后没有1,但从我所知,它会遇到与前一种解决方案相同的模板推导问题,因为我必须有一个元模板函数来反转张量的维度,这样我才能检查最后一个维度是否为1(因为我只能检查出现在参数包之前的参数),这将添加同样有问题的间接级别。事实上,我在
removeonsfromend
中也使用了一种反转技术

  • 您是否知道在参数包末尾或之后引用模板参数的另一种方法,可以避免模板推断的问题

考虑使用默认模板参数而不是可变模板,例如
模板结构张量{/*实现*/}。用这种方式实例化
张量
实际上就是实例化
张量
…这可能是一个解决方案,尽管这会使代码有点不雅观,并且不允许使用任意高阶的张量。如果没有其他方法,我可能会以这种方式结束,但我肯定更希望它能以某种方式与可变模板一起工作。同样,使用可变模板的类似方法也不起作用,因为我必须插入无限多的模板。另一个选项是提供添加和删除尾部模板的隐式转换。与其让助手
删除RailingOne
你还不如让助手
SameuptTrailingOne
@Caleth你能给我举个简单的例子吗?模模板向导,你希望
int[1]
int
的类型相同,对吗?
template <size_t TRows1, size_t TCols1Rows2, size_t TCols2>
Tensor<TRows1, TCols2> multiply(Tensor<TRows1, TCols1Rows2> t1, Tensor<TCols1Rows2, TCols2> t2)
{/*...*/}