gpt4 book ai didi

c++ - 绕过 vector,使用 basic_string

转载 作者:可可西里 更新时间:2023-11-01 18:08:09 25 4
gpt4 key购买 nike

这是一个安全的解决方法吗?我想使用 vector bool 但需要将指针传递给需要 C 样式数组的旧代码。

typedef std::basic_string<bool> vector_bool;

int main()
{
vector_bool ab;
ab.push_back(true);
ab.push_back(true);
ab.push_back(true);
ab.push_back(false);
bool *b = &ab[0];
b[1] = false;
}

编辑:感谢您对其他解决方案的建议,但我真的很想对我的上述解决方案做出明确的回答。谢谢。

最佳答案

我不确定 std::basic_string<bool>因为那会实例化 std::char_traits<bool>我不确定标准是否要求定义它,或者 char_traits 是否需要定义primary template 可以不定义,只有显式特化,例如 char_traits<char>被定义。您不能提供自己的特化 char_traits<bool>因为如果特化依赖于用户定义的类型,则只能特化标准模板,这 bool显然不是。也就是说,如果您的 stdlib 确实具有默认值 char_traits,它可能会起作用。定义,并且您不会尝试使用需要 char_traits 成员的字符串操作做任何有用的事情。

或者,这是 hacky 但可能有效:

struct boolish { bool value; };
inline boolish make_boolish(bool b) { boolish bish = { b }; return bish; }

std::vector<boolish> b;
b.push_back( make_boolish(true) );
bool* ptr = &b.front().value;

boolish是一个普通类型,所以只要是 boolish 的数组与 bool 的数组具有相同的表示形式(你需要检查你的编译器,我使用 static_assert 来检查没有填充)然后你可能会逃脱它,尽管它可能违反了别名规则,因为 *ptr*++ptr不属于同一个数组,因此递增指针不会指向下一个 boolish::value它指向前一个的“结束”(即使这两个位置实际上具有相同的地址,尽管 [basic.compound]/3 似乎确实说 ++ptr 确实“指向”下一个 bool ) .

C++11 的语法更简单,你不需要 make_boolish ...

#include <vector>
#include <assert.h>

struct boolish { bool value; };

int main()
{
std::vector<boolish> vec(10);
vec.push_back( boolish{true} );
bool* ptr = &vec.front().value;
assert( ptr[10] == true );
ptr[3] = true;
assert( vec[3].value == true );

static_assert( sizeof(boolish) == sizeof(bool), "" );
boolish test[10];
static_assert( sizeof(test) == (sizeof(bool)*10), "" );
}

关于c++ - 绕过 vector<bool>,使用 basic_string<bool>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15273964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com