C++ 什么是未知大小的共享?
在答复中,T.C.表示:C++ 什么是未知大小的共享?,c++,arrays,boost,shared-ptr,make-shared,C++,Arrays,Boost,Shared Ptr,Make Shared,在答复中,T.C.表示: boost::使_共享等。支持数组类型-未知类型之一 大小,或固定大小的一个 boost::shared_ptr sh_arr2=boost::make_shared(30); boost::shared_ptr sh_arr3=boost::make_shared(); 首先,如何使_共享支持大小未知的数组类型?我认为数组大小是必需的 第二,SHU arr2和SHU arr3的区别是什么?两者似乎都在创建一个int大小为30的数组。这个示例并没有那么好。对于大小未知
boost::使_共享
等。支持数组类型-未知类型之一
大小,或固定大小的一个
boost::shared_ptr sh_arr2=boost::make_shared(30);
boost::shared_ptr sh_arr3=boost::make_shared();
首先,如何使_共享支持大小未知的数组类型?我认为数组大小是必需的
第二,SHU arr2和SHU arr3的区别是什么?两者似乎都在创建一个int大小为30的数组。这个示例并没有那么好。对于大小未知的数组,它们可能意味着可以通过以下方式调用它:
int arr2_size = 30;
boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(arr2_size);
int arr2_size=30;
boost::shared_ptr sh_arr2=boost::make_shared(arr2_大小);
由于arr2_size
可以动态定义,因此可以将其视为“未知”
其次,它们都会创建一个大小为30的数组,但是sh_arr3
在类型本身中包含大小,这将允许编译器在访问超出边界时发出警告。没有显式大小的类型将无法检测这些情况
首先,如何使_共享支持大小未知的数组类型?我
我认为数组大小是必需的
Boost使用助手类来确定其共享的\u ptr::operator[](…)
的返回类型。它还使用另一个帮助器类boost::detail::sp_extent
,该类为数组类型提供专门化来确定边界(如果T
可以分解为T[]
),下面是一个摘要片段:
namespace boost{
模板
类共享\u ptr{
.....
typename boost::detail::sp_array_access::type operator[](std::ptrdiff_T i)const
{
BOOST_断言(px!=0);
BOOST|u ASSERT(i>=0&&(i::value | | BOOST::detail::sp_extent::value==0));
返回静态_cast::type>(px[i]);
}
....
}
名称空间详细信息{
模板结构sp\u数组\u访问
{typedef void type;};
模板struct sp\u array\u访问
{typedef T&type;};
模板struct sp\u array\u access
{typedef T&type;};
模板结构sp\u范围
{enum_vt{value=0};};
模板struct sp\u区段
{enum_vt{value=N};};
}//结束名称空间详细信息
}//结束命名空间提升
第二,SHU arr2和SHU arr3的区别是什么?两者似乎都是
要创建整数大小为30的数组
第二个包括范围检查。发件人:
从Boost release 1.53开始,shared_ptr可用于保存
指向动态分配数组的指针。这是通过
使用数组类型(T[]或T[N])作为模板参数。有
使用未调整大小的数组T[]和调整大小的数组几乎没有区别
数组,T[N];后者只允许运算符[]执行范围
检查索引
int arr2_size = 30;
boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(arr2_size);
namespace boost{
template<typename T>
class shared_ptr{
.....
typename boost::detail::sp_array_access< T >::type operator[] ( std::ptrdiff_t i ) const
{
BOOST_ASSERT( px != 0 );
BOOST_ASSERT( i >= 0 && ( i < boost::detail::sp_extent< T >::value || boost::detail::sp_extent< T >::value == 0 ) );
return static_cast< typename boost::detail::sp_array_access< T >::type >( px[ i ] );
}
....
}
namespace detail{
template< class T > struct sp_array_access
{ typedef void type; };
template< class T > struct sp_array_access< T[] >
{ typedef T & type; };
template< class T, std::size_t N > struct sp_array_access< T[N] >
{ typedef T & type; };
template< class T > struct sp_extent
{ enum _vt { value = 0 }; };
template< class T, std::size_t N > struct sp_extent< T[N] >
{ enum _vt { value = N }; };
}//end namepace detail
}//end namespace boost