C++ class 大小模板推导

C++ class size template deduction

我有以下功能:

template <uint8_t N1, uint8_t N2, uint8_t N3>
Shape<N3> func(const Shape<N1> &shape1, const Shape<N2> &shape2)
{
    return Shape<N3>();
}

形状定义:

template <uint8_t N> class Shape;

有没有办法通过传递给函数的 Shapes 推导出 N1 和 N2?

Shape<3> shape1 = {1, 2, 3};
Shape<2> shape2 = {4, 5};
Shape<4> shape3 = func<4>(shape1, shape2);

而不是:

Shape<4> shape3 = func<3, 2, 4>(shape1, shape2);

感谢您的帮助!

你应该安排你的模板参数,使需要显式指定的参数在开头,而可以从参数推导出的参数在结尾:

template <uint8_t N3, uint8_t N1, uint8_t N2>
Shape<N3> func(const Shape<N1> &shape1, const Shape<N2> &shape2)
{
    return ...;
}

Shape<3> shape1 = {1, 2, 3};
Shape<2> shape2 = {4, 5};
Shape<4> shape3 = func<4>(shape1, shape2);

这里,N3 明确指定为 4,而 N1N2 是从参数类型推导出来的,因此所有模板参数都有值并且代码可以编译。如果你在最后留下 N3,那么你将被迫显式指定 N1N2 以便显式指定 N3.