在可变参数构造函数中初始化常量数组
Initialize const array in a variadic constructor
我想从可变参数初始化一个常量数组。但是使用此代码,仅初始化值数组中的第一个值,其余值为零。我该如何解决它?
我从未处理过可变参数,我不知道它们基本上是如何工作的。
struct Object
{
const int values[8];
constexpr Object()
: values{}
{}
constexpr Object(int values...)
: values{values}
{}
}
// in main.cpp :
Object o = { 1, 2, 3 };
附加问题:我可以编写一个类模板并使其数组大小等于可变参数计数吗?
要修复第一个代码,您可以编写:
template<class ... Values>
constexpr Object(Values ... values)
: values{values...}
{
static_assert(sizeof...(values) == 8);
}
关于您的其他问题:
template<int ... ints>
struct Object2
{
const int values[sizeof...(ints)]{ints...};
};
Object2<1,21,3> o2; // array with 3 elements
std::cout << o2.values[1] << std::endl; // 21
数组的大小需要在编译时知道。因此,在调用构造函数时无法指定数组的长度,为时已晚。但是,在实例化模板时可以使用非类型参数。
演示
自 C++17 起,我们可以利用用户定义的演绎指南:
template <class T, size_t N>
class Object
{
T d_[N];
public:
Object() = default;
template <class... Ts>
constexpr Object(Ts... others) : d_{others...} {}
constexpr auto size() const noexcept { return N; }
constexpr auto operator[] (size_t i) const noexcept { return d_[i]; }
};
// Deduction guide
template <class T, class... Ts> Object(T, Ts...) -> Object<T, 1 + sizeof...(Ts)>;
住在这里。
相关文章:
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 初始化常量字符* 数组
- 为什么MSVC14允许声明指向动态未初始化常量对象的指针
- C++初始化常量
- 在可变参数构造函数中初始化常量数组
- 使用数字初始化常量引用
- 如何在不初始化常量的情况下声明数组?
- 初始化常量静态 std::map unique_ptr作为值
- 为什么您可以初始化常量引用,但不能初始化来自右值的非常量引用
- 类中的初始化常量
- 如何初始化常量 CLSID
- 在类中初始化常量数组
- 在声明C++之后初始化常量变量
- C++初始化:常量全局与静态类成员的顺序
- 在头文件中声明并初始化常量
- 恒常性添加无效?错误:无法使用字符**初始化常量字符**
- 为什么我能够在构造函数中初始化常量
- 通过指针初始化常量矩阵<双精度,0,80>(来自 Dlib)
- C++构造函数:初始化常量引用时出现垃圾
- 用自身初始化C++常量变量