我有一个类Color
,它是 的薄包装器std::array
。我希望能够以两种方式使用它:
Color<5> color{1,2,3,4,5}
应该产生color.values = [1,2,3,4,5]
Color<5> color{3}
应该产生color.values = [3,3,3,3,3]
我目前拥有的是:
template <size_t N>
class Color {
public:
Color() = default;
Color(std::array<float, N> values) : values{ values } {};
template <IsNumeric... T>
Color(T... v) : values{ static_cast<float>(v)... } { };
....
private:
std::array<float, N> values;
}
对于我的第一个案例,这可以正常工作。但是对于第二个案例,它只生成:color.values = [3,0,0,0,0]
。我不知道如何让第二个案例起作用。我试过:
template <size_t N>
class Color {
public:
Color() = default;
Color(std::array<float, N> values) : values{ values } {};
template <IsNumeric... T, typename std::enable_if<(sizeof...(T) == N), bool>::type = true>
Color(T... v) : values{ static_cast<float>(v)... } { };
template <IsNumeric T>
Color(T v) : values{ std::array<float, N>{ static_cast<float>(v) } } { };
...
}
但这并没有改变任何事情。
std::index_sequence
您可以在和辅助函数的帮助下完成此操作。由于您已经在使用概念,因此您应该使用requires
子句来替换std::enable_if
。您的代码没有显示成员
values
的类型,但问题标题以及其他构造函数似乎暗示它是,std::array
而这正是我在这里使用的。无论如何,只要类型values
具有执行正确操作的可变构造函数,它就应该有效。可以通过以下测试main函数来验证:
演示:https ://godbolt.org/z/KGeehW5x6
您可以使用一个函数来拥有一个构造函数
fillpad
,该函数将最多 M 个项目填充到数组中(M 是初始化列表中的项目数)。如果 M <N,您可以使用列表的最后一个值完成数组。
演示
请注意,如果您想强制提供 1 个或 N 个参数,则可以用以下方法替换函数
static_assert
中的fillpad
:对于接口中需要“index_sequence”的类型,我倾向于将其作为模板参数:
演示