繁体   English   中英

我该如何投射一个std :: vector <const unsigned char> 到const std :: vector <unsigned char> ?

[英]How can I cast an std::vector<const unsigned char> to a const std::vector<unsigned char>?

如何在不复制数据的情况下将std::vector<const unsigned char>转换为const std::vector<unsigned char>

Parser::Parser( const std::vector< unsigned char > &i_Data )
{
    Parse(i_Data);
}

Parser::Parser( std::vector< const unsigned char > i_Data )
{
    Parse( (std::vector< unsigned char >)(i_Data) );  // <-- Error
}

int Parser::Parse( const std::vector< unsigned char > &i_Data )
{ ... }

这是来自Visual C ++ 2010的错误消息:

错误C2440'类型转换':无法从'std :: vector <_Ty>'转换为'std :: vector <_Ty>'

如何在不复制数据的情况下将std::vector<const unsigned char>转换为const std::vector<unsigned char>

你不能 两种类型无关。

与其具有如此严格的接口(采用std::vector< unsigned char > const& ),您应该将其推广为采用一对迭代器。 在这种情况下,也许只有两个指向const unsigned char指针:

Parser(unsigned char const* begin, unsigned char const* end)
{
    ...
}

现在,如果需要,您可以通过以下方式添加两个vector构造函数以委托给该vector构造函数:

Parser(std::vector<unsigned char> const& v)
: Parser(v.data(), v.data + v.size())
{ }

注意:在C ++ 11之前的版本中,由于vector尚没有data()函数,因此将vector委托给两个指针的方法是编写如下内容:

template <class T, class A>
T* data(std::vector<T, A>& v) {
    return v.empty() ? 0 : &v[0];
}

template <class T, class A>
T const* data(std::vector<T, A> const& v) {
    return v.empty() ? 0 : &v[0];
}

然后只需使用data(v)代替。

使用此强制转换,它可以正确编译:

Parser::Parser( std::vector< const unsigned char > i_Data )
{
    Parse( (std::vector< unsigned char >)(i_Data) );             // <-- Error
    Parse( ( const std::vector< unsigned char > &)( i_Data ) );  // <-- OK
}

int Parser::Parse( const std::vector< unsigned char > &i_Data )
{ ... }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM