没有reinterpret_cast,将:: GIL位8*增加到gray8_ptr_t?

tot*_*two 16 c++ boost boost-gil

尝试按照GIL的设计指南工作,我bits__用于我的频道数据类型.我经常将外部数据包装到GIL图像视图中.但是,即使使用bits__数据指针的类型,我也必须在我创建图像视图之前添加reinterpret_cast.请使用以下代码

int width = 3;
int height = 2;

boost::gil::bits8 data8[] = {0, 1, 100, 200, 50, 51};
boost::gil::bits8* pBits8 = data8;
boost::gil::gray8_ptr_t pGray8 = pBits8;

boost::gil::gray8_view_t v = interleaved_view(width, height, pGray8, width * sizeof(boost::gil::bits8));
Run Code Online (Sandbox Code Playgroud)

导致第6行的错误"错误C2440:'初始化':无法从'boost :: gil :: bits8*'转换为'boost :: gil :: gray8_ptr_t'1>指向的类型不相关;转换需要reinterpret_cast, C风格演员或功能风格演员阵容"

尽可能多地深入研究源代码,看起来这些类型确实是未发布的.bits8只是unsigned char,但是gray8_ptr_t指向a的指针struct pixel<bits8,gray_layout_t>.这个结构的唯一元素是单个bit8,因此reinterpret_cast看起来很安全.它也适用于我抛出的测试.

但是,我经常将外部数据包装到图像视图中,并且在每个地方都进行reinterpret_cast会产生问题.有没有更安全的方法来构建用于GIL的像素指针?

目前的解决方法:

template<class Dest, class Src>
Dest gil_safe_ptr_cast(Src src)
{
    // this cast is unsafe, use reinterpret_cast 
    BOOST_STATIC_ASSERT(false);
}
template<> boost::gil::gray8_ptr_t gil_safe_ptr_cast(boost::gil::bits8* pBits8)
{
    return reinterpret_cast<boost::gil::gray8_ptr_t>(pBits8);
}
boost::gil::bits8* pBits8 = data8;
boost::gil::gray8_ptr_t pGray8 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits8); // works
boost::gil::bits16* pBits16 = NULL;
boost::gil::gray8_ptr_t pGray82 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits16); // compile error as expected
Run Code Online (Sandbox Code Playgroud)

tot*_*two 1

template<class Dest, class Src>
Dest gil_safe_ptr_cast(Src src)
{
    // this cast is unsafe, use reinterpret_cast 
    BOOST_STATIC_ASSERT(false);
}
template<> boost::gil::gray8_ptr_t gil_safe_ptr_cast(boost::gil::bits8* pBits8)
{
    return reinterpret_cast<boost::gil::gray8_ptr_t>(pBits8);
}
boost::gil::bits8* pBits8 = data8;
boost::gil::gray8_ptr_t pGray8 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits8); // works
boost::gil::bits16* pBits16 = NULL;
boost::gil::gray8_ptr_t pGray82 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits16); // compile error as expected
Run Code Online (Sandbox Code Playgroud)