C++ベース-bitsetとstringの相互変換
3709 ワード
bitsetクラステンプレートはstringタイプデータとの変換に非常に直接的なインタフェースを提供します.しかし、注意しなければならない細部は非常に煩雑です.具体的にどのように煩雑なのか、以下の分解を見てみましょう.
本明細書を読む前に、bitsetテンプレートクラスの実装の基礎、すなわち非タイプテンプレートパラメータ技術を知る必要があります.
bitset<>クラステンプレートの非タイプパラメータのインスタンス化は、stringタイプを受け入れることができ、
stringタイプパラメータの構造および
2番目のバージョンでは、コンパイラがインスタンス化方法を知らないため、コンパイラエラーが古いコンパイラで発生する可能性があります.同様に、メンバーテンプレート関数の特性のため、直接このように書くことはできません.
こんなブスに書かなければなりません
実際には、コードの読み取り可能性のために、次の補助関数を構築することができます. stringタイプパラメータに対する構造
クライアント・プログラム:
ここでは、は、
本明細書を読む前に、bitsetテンプレートクラスの実装の基礎、すなわち非タイプテンプレートパラメータ技術を知る必要があります.
bitset<>クラステンプレートの非タイプパラメータのインスタンス化は、stringタイプを受け入れることができ、
bitset<>::to_string
メンバー関数はstring
型への変換を実現することができる.ただし、string
はパラメータの構造であり、to_string
はメンバーテンプレートである.ライブラリクラスstd::basic_string
自体もテンプレートであるため、一般的なstringクラス形式であり、std::string
はbasic_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
の存在は、コンパイラに伝えるためであり、その後の最初の<
は、番号より小さいのではなく、テンプレートパラメータリストのフォーマットである.実際には、コードの読み取り可能性のために、次の補助関数を構築することができます.
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> >();
}