【问题标题】: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>?
【发布时间】:2016-05-16 16:41:28
【问题描述】:

如何在不复制数据的情况下将std::vector&lt;const unsigned char&gt; 转换为const std::vector&lt;unsigned char&gt;

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 'type cast':无法从 'std::vector<_ty>' 转换为 'std::vector<_ty>'

【问题讨论】:

  • 我假设您正试图避免复制数据。对吗?
  • @NathanOliver:正确。
  • 你应该休息一下,想想你为什么要这样做..
  • std::vector&lt;const unsigned char&gt; 无论如何都是未定义的行为。
  • @NathanOliver 在 C++03 中,容器元素必须是Assignable;在 C++11 及更高版本中,分配器要求禁止 const 值类型。

标签: c++ casting


【解决方案1】:

如何在不复制数据的情况下将std::vector&lt;const unsigned char&gt; 转换为const std::vector&lt;unsigned char&gt;

你不能。这两种类型是无关的。

与其拥有如此严格的接口(采用std::vector&lt; unsigned char &gt; const&amp;),不如将其概括为采用一对迭代器。在这种情况下,可能只有两个指向 const unsigned char 的指针:

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

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

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

注意:在 C++11 之前,由于 vector 还没有 data() 函数,将向量委托给两个指针的方法是这样写:

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) 代替。

【讨论】:

  • 不确定 VS2010 是否有委托构造函数。但是他们无论如何都委托给一个成员函数,所以这不是一个大问题。此外,将end 作为指针有点棘手。
  • @T.C. data()data() + size()?
  • 是的。 “有点棘手”的部分是有人可能会尝试&amp;*end()vector直到C++11才有data(),也不知道VS2010里有多少C++11。
【解决方案2】:

通过这个转换,它可以正确编译:

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 )
{ ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2021-07-11
    • 2014-02-19
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多