C++ 如何投射std::vector<;常量无符号字符>;到常量std::vector<;无符号字符>;?
在不复制数据的情况下,如何将C++ 如何投射std::vector<;常量无符号字符>;到常量std::vector<;无符号字符>;?,c++,casting,C++,Casting,在不复制数据的情况下,如何将std::vector强制转换为const std::vector 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 ch
std::vector
强制转换为const std::vector
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 )
{ ... }
Parser::Parser(const std::vector&i_数据)
{
解析(i_数据);
}
Parser::Parser(std::vectori_数据)
{
解析((std::vector)(i_数据));/&i_数据)
{ ... }
这是VisualC++ 2010中的错误信息:
错误C2440“类型转换”:无法从“std::vector”转换为 “std::vector” 在不复制数据的情况下,如何将std::vector
强制转换为const std::vector
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 )
{ ... }
你不能。这两种类型是不相关的
不要有这样一个严格的接口(使用std::vectorconst&
),您应该将它概括为使用一对迭代器。在这种情况下,可能只需要指向const unsigned char
的两个指针:
Parser(unsigned char const* begin, unsigned char const* end)
{
...
}
现在,如果需要,您可以添加两个向量
构造函数,通过以下方式委托给此构造函数:
Parser(std::vector<unsigned char> const& v)
: Parser(v.data(), v.data + v.size())
{ }
然后简单地使用数据(v)
在不复制数据的情况下,如何将std::vector
强制转换为const std::vector
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 )
{ ... }
你不能。这两种类型是不相关的
不要有这样一个严格的接口(使用std::vectorconst&
),您应该将它概括为使用一对迭代器。在这种情况下,可能只需要指向const unsigned char
的两个指针:
Parser(unsigned char const* begin, unsigned char const* end)
{
...
}
现在,如果需要,您可以添加两个向量
构造函数,通过以下方式委托给此构造函数:
Parser(std::vector<unsigned char> const& v)
: Parser(v.data(), v.data + v.size())
{ }
然后只需使用
数据(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 )
{ ... }
Parser::Parser(std::vectori_数据)
{
解析((std::vector)(i_数据));//&(i_数据));//&i_数据)
{ ... }
使用此强制转换,它可以正确编译:
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 )
{ ... }
Parser::Parser(std::vectori_数据)
{
解析((std::vector)(i_数据));//&(i_数据));//&i_数据)
{ ... }
我假设您试图避免复制数据。对吗?@NathanOliver:对。您应该休息一下,想想为什么要这样做。std::vector
是未定义的行为。@NathanOliver在C++03中,容器元素要求是可分配的
;在C++11及更高版本中,分配器要求orbidconst
值类型。我假设您试图避免复制数据。是否正确?@NathanOliver:正确。您应该休息一下,想想为什么要这样做。std::vector
无论如何都是未定义的行为。@NathanOliver在C++03中,容器元素必须是可赋值的;在C++11和l中此外,分配器要求禁止const
值类型。不确定VS2010是否有委托构造函数。但无论如何,它们都是委托给成员函数,所以这不是一个大问题。此外,将end
作为指针有点棘手。@T.C.data()
和data()+size()
?是的。“有点棘手”部分原因是有人可能会尝试&*end()
vector
没有数据()
直到C++11,我不知道VS2010中有多少C++11。不确定VS2010是否有委托构造函数。但他们无论如何都在委托给成员函数,所以这不是一个大问题。另外,将end
作为指针有点棘手。@t.C.data()
和data()+size()
?是的。“有点棘手”部分原因是有人可能会尝试&*end()
vector
直到C++11才有数据()
,我不知道VS2010中有多少C++11。