c-来自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样式数组的包装器(例如正在实施),请参见C 11. 但是,正如您在评论中说的那样,您这样做主要是出于教育目的.在这种情况下,您拥有的是体面的.语法可以稍微清理一下.考虑:
//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());
这样,无论何时取消引用,其值都将转换为右值引用,从而允许移动分配.
标签:c,constructor,initializer-list 来源: https://codeday.me/bug/20191011/1890391.html