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