2016-06-21 10 views
1

Есть ли способ использовать initializer_list для построения bitset?Использование initializer_list с битами

Например, я хотел бы сделать:

const auto msb = false; 
const auto b = true; 
const auto lsb = false; 
const bitset<3> foo = {msb, b, lsb}; 

Но когда я пытаюсь это я получаю:

error: could not convert {msb, b, lsb} from '<brace-enclosed initializer list>' to const std::bitset<3u>

Должен ли я использовать сдвиги построить unsigned long для инициализации foo, или есть ли способ сделать это, о котором я не знаю?

ответ

3

Не существует конструктора, который мог бы непосредственно построить битовый набор из списка инициализации. Вам нужна функция:

#include <bitset> 
#include <initializer_list> 
#include <iostream> 

auto to_bitset(std::initializer_list<bool> il) 
{ 
    using ul = unsigned long; 
    auto bits = ul(0); 
    if (il.size()) 
    { 
     auto mask = ul(1) << (il.size() - 1); 

     for (auto b : il) { 
      if (b) { 
       bits |= mask; 
      } 
      mask >>= 1; 
     } 
    } 
    return std::bitset<3> { bits }; 

} 

int main() 
{ 
    auto bs = to_bitset({true, false, true}); 

    std::cout << bs << std::endl; 
} 

Ожидаемые результаты:

101 

Как уже упоминалось в комментариях, VARIADIC версия также возможно.

#include <bitset> 
#include <iostream> 
#include <utility> 

namespace detail { 
    template<std::size_t...Is, class Tuple> 
    auto to_bitset(std::index_sequence<Is...>, Tuple&& tuple) 
    { 
     static constexpr auto size = sizeof...(Is); 
     using expand = int[]; 
     unsigned long bits = 0; 
     void(expand { 
      0, 
      ((bits |= std::get<Is>(tuple) ? 1ul << (size - Is - 1) : 0),0)... 
     }); 
     return std::bitset<size>(bits); 
    } 
} 

template<class...Bools> 
auto to_bitset(Bools&&...bools) 
{ 
    return detail::to_bitset(std::make_index_sequence<sizeof...(Bools)>(), 
          std::make_tuple(bool(bools)...)); 
} 

int main() 
{ 
    auto bs = to_bitset(true, false, true); 

    std::cout << bs << std::endl; 
} 
+0

Так что ответ: мне нужно делать смены, но функция - приятное прикосновение. –

+0

@ JonathanMee 'боится так. TBH - функция шаблона с точки зрения вариационного bool может быть более изящной на данный момент. –