简体   繁体   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>?

How can I cast an std::vector<const unsigned char> to a const std::vector<unsigned char> , without copying the data? 如何在不复制数据的情况下将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 )
{ ... }

This is the error message from Visual C++ 2010: 这是来自Visual C ++ 2010的错误消息:

Error C2440 'type cast' : cannot convert from 'std::vector<_Ty>' to 'std::vector<_Ty>' 错误C2440'类型转换':无法从'std :: vector <_Ty>'转换为'std :: vector <_Ty>'

How can I cast an std::vector<const unsigned char> to a const std::vector<unsigned char> , without copying the data? 如何在不复制数据的情况下将std::vector<const unsigned char>转换为const std::vector<unsigned char>

You can't. 你不能 The two types are unrelated. 两种类型无关。

Instead of having such a strict interface (taking a std::vector< unsigned char > const& ), you should generalize it to take a pair of iterators. 与其具有如此严格的接口(采用std::vector< unsigned char > const& ),您应该将其推广为采用一对迭代器。 In this case, perhaps just two pointers to const unsigned char : 在这种情况下,也许只有两个指向const unsigned char指针:

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

Now if you want you can add the two vector constructors to delegate to this one via: 现在,如果需要,您可以通过以下方式添加两个vector构造函数以委托给该vector构造函数:

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

Note: Pre-C++11, since vector doesn't have a data() function yet, the way to delegate a vector to two pointers be to write something like: 注意:在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];
}

And then simply use data(v) instead. 然后只需使用data(v)代替。

With this cast it compiles correctly: 使用此强制转换,它可以正确编译:

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