C++ベース-bitsetとstringの相互変換


bitsetクラステンプレートはstringタイプデータとの変換に非常に直接的なインタフェースを提供します.しかし、注意しなければならない細部は非常に煩雑です.具体的にどのように煩雑なのか、以下の分解を見てみましょう.
本明細書を読む前に、bitsetテンプレートクラスの実装の基礎、すなわち非タイプテンプレートパラメータ技術を知る必要があります.
bitset<>クラステンプレートの非タイプパラメータのインスタンス化は、stringタイプを受け入れることができ、bitset<>::to_stringメンバー関数はstring型への変換を実現することができる.ただし、stringはパラメータの構造であり、to_stringはメンバーテンプレートである.ライブラリクラスstd::basic_string自体もテンプレートであるため、一般的なstringクラス形式であり、std::stringbasic_string<char>の別名である.
typedef basic_string<char, char_traits<char>, allocator<char> >
    string;

stringタイプパラメータの構造およびto_stringはいずれもメンバーテンプレートとして定義されているため(新しいc++標準はこれらの条件を緩和しているが、厳格で、少し早いコードを読むのに便利であるため、整理されている):
//     
std::bitset<6>(std::string("110101"));
//    
std::bitset<6>("110101");

2番目のバージョンでは、コンパイラがインスタンス化方法を知らないため、コンパイラエラーが古いコンパイラで発生する可能性があります.同様に、メンバーテンプレート関数の特性のため、直接このように書くことはできません.
string s = b.to_string();

こんなブスに書かなければなりません
string s = 
    b.template to_string<char, char_traits<char>,
         allocator<char> >();
b.templateの存在は、コンパイラに伝えるためであり、その後の最初の<は、番号より小さいのではなく、テンプレートパラメータリストのフォーマットである.
実際には、コードの読み取り可能性のために、次の補助関数を構築することができます.
  • stringタイプパラメータに対する構造
  • template<size_t N>
    bitset<N> from_string(const string& s)
    {
        return bitset<N>(s);
    }
    

    クライアント・プログラム:
    bitset<6> b = from_string<6>("110101");

    ここでは、const string& s = "110101";の変換が暗黙的に存在する.
  • は、b.to_stringというテンプレートメンバー変数に対して、パッケージを継続できます.
  • template<size_t N>
    std::string to_string(const std::bitset<N>& b)
    {
        return b.template
            to_string<char, char_traits<char>, allocator<char> >();
    }