【问题标题】:Is there a standard way to replace a C-style bool array?是否有替换 C 样式布尔数组的标准方法?
【发布时间】:2018-02-17 07:21:57
【问题描述】:

在这段代码中

void legacyFunction(int length, bool *bitset)
{
    // stuff, lots of stuff
}

int main()
{
    int somenumber = 6;
    // somenumber is set to some value here

    bool *isBitXSet = new bool[somenumber];
    // initialisation of isBitXSet.

    legacyFunction(somenumber, isBitXSet);

    delete[] isBitXSet;
    return 0;
}

我想用类似的东西替换bool *isBitXSet = new bool[somenumber];

std::vector<bool> isBitXset(somenumber, false);

但我做不到

legacyFunction(somenumber, isBitXSet.data());

因为data() 不存在std::vector&lt;bool&gt;。而且legacyFunction()的接口我也改不了。

C 风格的 bool 数组有什么好的替代品吗?

【问题讨论】:

  • 请注意,缺少data() 成员函数并不是唯一的问题。 std::vector&lt;bool&gt; 是一种专业化,可以提供更节省空间的实现。所以vector&lt;bool&gt;的元素和一个C风格的bool数组可能不会重叠。
  • @moooeeeep 是的,对,对不起。通常我会自己删除问题。但我更喜欢 Vittorio Romeo 给出的答案,而不是 2009 年的任何答案。
  • 不用担心。我只是想让它们链接起来,并认为它们的相关性可能足够近,可以将它们作为重复项。其他人可能不同意。

标签: c++ arrays boolean std


【解决方案1】:

您可以使用std::unique_ptr&lt;T[]&gt;std::make_unique

int main()
{
    int somenumber = 6;
    // somenumber is set to some value here

    auto isBitXSet = std::make_unique<bool[]>(somenumber);    
    // initialisation of isBitXSet.

    legacyFunction(somenumber, isBitXSet.get());

    return 0;
}

或者,您可以通过创建自己的 bool 包装器来“欺骗”std::vector

struct my_bool { bool _b; };
std::vector<my_bool> v; // will not use `vector<bool>` specialization

如果您在编译时知道数组的大小,请考虑使用std::array

【讨论】:

  • std::array不是也有可能吗?
  • @Rakete1111:如果somenumber 是运行时值,则不是,如示例中所示。
  • 不错的答案!在您的第二个示例中:我将如何应用它来进行函数调用?喜欢这个legacyFunction(somenumber, reinterpret_cast&lt;bool*&gt;(v.data()));
  • @TobiMcNamobi:这可能会起作用,但我不确定它的安全性和标准合规性。仅在适当研究后使用。我建议使用unique_ptr
  • @TobiMcNamobi legacyFunction(somenumber, &amp;v[0]); 怎么样?
猜你喜欢
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2012-03-02
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多