Я попытался заставить его работать на вашем примере, и следующее (довольно грязное) решение работало нормально:
#include <iostream>
#include <vector>
void test_print(bool * arr, size_t s)
{
for(unsigned int i = 0; i< s; ++i)
std::cout << i << ": " << (arr[i]?"true\n":"false\n");
std::cout << std::endl;
}
int main()
{
bool b_arr[5] = {true, false, false, true, false};
test_print(b_arr, 5);
//std::vector <uint8_t> b_vec = {true, false, false, true, false}; // former proposal
std::vector <char> b_vec = {true, false, false, true, false}; // new proposal
test_print(reinterpret_cast<bool*>(b_vec.data()), b_vec.size());
return 0;
}
Вывод, который я получил:
0: правда
1: ложно
2: ложно
3: правда
4: ложно
0: правда
1: ложно
2: ложно
3: правда
4: ложно
Однако я не знаю, будет ли он вести себя одинаково на каждой системе / платформе. Но если вы не собираетесь менять свою систему / платформу, и если она действительно работает на вашей, я думаю, что она могла бы сделать эту работу, даже если это довольно грязное решение.
На самом деле, если мы можем гарантировать, что sizeof(bool) == sizeof(uint8_t)
и при условии, что true
и false
соответственно обрабатываются в памяти как целые числа 1
и 0
, это решение будет работать, но не иначе.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: заменены uint8_t
на char
тип.
EDIT2:
Другое решение, которое не нарушает правило строгого наложения имен, - это то, о котором Камил Цук упомянул, - создание оболочки Bool и проверка того, что sizeof(bool) == sizeof(Bool)
.
Возможная реализация (только базовый код) может быть:
struct Bool
{
bool v;
Bool(bool bv=false) : v(bv)
{}
};
И тогда вы сможете написать:
std::vector<Bool> b_vec {true, false, false, true, false};
test_print(reinterpret_cast<bool*>(b_vec.data()), b_vec.size());
у меня сработало:)