我有以下课程:
template <size_t N, float... Lam> requires (sizeof...(Lam) == N)
class Spectrum {
public:
Spectrum() : wavelengths{ static_cast<float>(Lam)... }
{
values.fill(0.f);
};
template <IsNumeric T>
Spectrum(T v) : wavelengths{ static_cast<float>(Lam)... }
{
values.fill(static_cast<float>(v));
};
template <IsNumeric... T> requires (sizeof...(T) == N)
Spectrum(T... v) : wavelengths{ static_cast<float>(Lam)... }, values { static_cast<float>(v)... }
{ };
... // Other methods/overloads that aren't relevant here
private:
std::array<float, N> values;
const std::array<float, N> wavelengths;
};
然后我可以使用以下方式调用它:
Spectrum<3, 450.f, 500.f, 600.f> color{ 1,2,3 };
它的行为符合预期(波长用
450.f, 500.f, 600.f
填充,值用 1.f, 2.f, 3.f
填充。
我希望能够允许用户拨打:
Spectrum<3, 450, 500, 600> color{1,2,3};
在这种情况下,
450
是一个int
,所以我需要将它转换为float
,就像我在构造函数模板中已经做的那样。 我只是不确定类模板本身是否可以表达类似的想法。
template<auto...Lam>
using Spectrum_t = Spectrum<sizeof...(Lam), static_cast<float>(Lam)...>;
他们甚至不必通过
3
。 不知道为什么你会通过它。