[英]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 aconst 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.