当前位置: 首页 > 综合

关于c++initializer_list和T数组的转换|焦点关注

来源:哔哩哔哩 发布时间:2023-02-19 22:09:14

众所周知,initalizer_list实际上的内存使用部分只有两个,一个指针,一个长度,源码如下:

template<class _E>

class initializer_list


(资料图)

{

private:

const _E* _M_array;

size_t   _M_len;

// The compiler can call a private constructor.

constexpr initializer_list(const_iterator __a, size_type __l)

: _M_array(__a), _M_len(__l) { }

};

而一个指针加一个长度的构造函数已经私有化,调用不了了,也没有相应的赋值函数。

看似不能用一个指针+一个长度来构造对象了。

可是,确实如此吗?

在这里,定义了一个长度为n的数组a,如何将数组a赋值给一个initializer_list?

似乎没有办法对吧?

但是initializer_list本身的有效内存存储只有指针+长度,类似与pair<T,size_t>,

而pair实际上的有效内存如下:

struct pair

{

typedef _T1 first_type; 

typedef _T2 second_type; 

pair(const _T1& __a, const _T2& __b)

: first(__a), second(__b) { }

};

而众所周知,memcpy,定义在string.h中,可以通过指针无差别内存拷贝。

所以,思路不就有了吗——

template<class t>

void func(initializer_list<t>&lis,t*a,size_t n){

pair<const t*,size_t>ass(a,n);

memcpy(&lis,&ass,sizeof(ass));

}

这个函数可以实现数组转initializer_list

Copyright ©  2015-2022 每日贵州网版权所有  备案号:京ICP备12018864号-37   联系邮箱:291 323 6@qq.com