欢迎光临散文网 会员登陆 & 注册

关于c++initializer_list和T数组的转换

2023-02-19 22:07 作者:呼唤伙伴的小金鱼  | 我要投稿

众所周知,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

关于c++initializer_list和T数组的转换的评论 (共 条)

分享到微博请遵守国家法律