来自initializer_list的构造函数
Constructor from initializer_list
我正在用 c++ 实现一个容器,实际上是数组的包装器。我不确定如何从initializer_list实现构造函数。我最终得到了这个实现,但在我看来真的很丑陋。因此,可以在由initializer_list初始化的堆中分配数组。还是有一种优雅的方法可以做到这一点?
template <typename T> class sequence {
public:
sequence (size_t n): _data {new T[n]}, _size {n} {};
sequence (std::initializer_list<T> source);
~sequence() { delete[] _data; };
private:
pointer _data;
size_type _size;
};
//Initializer list constructor
template <class T> sequence<T>::sequence (std::initializer_list<T> source)
: sequence(source.size()) {
auto iterator = source.begin();
for ( int i=0; i < _size; i++) {
_data[i] = *iterator;
++iterator;
}
};
取决于你要做什么。
如果您实际上需要使用在编译时确定的具有有限大小的序列,请使用 std::array<T,std::size_t>
,它是 C++11 中引入的 C 样式数组(就像您正在实现的数组)的包装器。
但是,正如您在一条评论中所说,您这样做主要是为了教育目的。 在这种情况下,您拥有的是体面的。 语法可以稍微清理一下。 考虑:
//Initializer list constructor
template <class T>
sequence<T>::sequence (std::initializer_list<T> source)
: sequence(source.size())
{
auto it = source.begin();
auto const e = source.cend();
auto d = data_;
while (it != e) {
*d++ = *it++;
}
};
这样您就不会明确依赖size()
。 您可以考虑通过将it
和e
迭代器转换为"移动"迭代器来提高效率:
auto it = std::make_move_iterator(source.begin());
auto e = std::make_move_iterator(source.end());
这样,每当取消引用时,其值都会强制转换为右值引用,从而允许移动分配。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- std::list 模板是否需要其实例类型中的复制构造函数(或等效项)?
- 错误:没有用于初始化'List<double>::node'的匹配构造函数
- 'list::list'命名构造函数,而不是类型
- 使用 boost 将 std::list 传递给构造函数,list_of不编译
- std::list 的默认构造函数可以<int>抛出吗?
- std::list<std::unique_ptr>:空初始值设定项列表与默认构造函数
- 以vector、list或map为成员的类需要复制构造函数
- 为什么std::list中的单参数构造函数定义为显式