質問
これは愚かな質問かもしれませんが、1 が "true" に、0 が "false" になるようにブール値を文字列に変換する方法はありますか?if ステートメントを使用することもできますが、言語または標準ライブラリでそれを行う方法があるかどうかを知りたいと思います。それに、私は衒学的です。:)
解決
C++ 言語自体を使用してみてはどうでしょうか?
bool t = true;
bool f = false;
std::cout << std::noboolalpha << t << " == " << std::boolalpha << t << std::endl;
std::cout << std::noboolalpha << f << " == " << std::boolalpha << f << std::endl;
アップデート:
コンソール出力なしで 4 行を超えるコードが必要な場合は、次のサイトにアクセスしてください。 cppreference.com のページで話題になっています std::boolalpha
そして std::noboolalpha
コンソール出力が表示され、API について詳しく説明されています。
追加で使用する std::boolalpha
のグローバル状態を変更します std::cout
, 、元の動作に戻したい場合があります 状態の復元の詳細については、ここにアクセスしてください std::cout
.
他のヒント
C++ について話しているんですよね?一体なぜ私たちはまだマクロを使用しているのでしょうか?
C++ インライン関数を使用すると、マクロと同じ速度が得られ、さらにタイプ セーフティとパラメータ評価の利点も得られます (これにより、Rodney と dwj が言及した問題が回避されます)。
inline const char * const BoolToString(bool b)
{
return b ? "true" : "false";
}
それとは別に、特に受け入れられた答えに関して、他にもいくつか不満があります:)
// this is used in C, not C++. if you want to use printf, instead include <cstdio>
//#include <stdio.h>
// instead you should use the iostream libs
#include <iostream>
// not only is this a C include, it's totally unnecessary!
//#include <stdarg.h>
// Macros - not type-safe, has side-effects. Use inline functions instead
//#define BOOL_STR(b) (b?"true":"false")
inline const char * const BoolToString(bool b)
{
return b ? "true" : "false";
}
int main (int argc, char const *argv[]) {
bool alpha = true;
// printf? that's C, not C++
//printf( BOOL_STR(alpha) );
// use the iostream functionality
std::cout << BoolToString(alpha);
return 0;
}
乾杯 :)
@ドクターピザ:これほど単純な関数のためにブースト ライブラリ全体を含める必要がありますか?冗談でしょ?
C++ には適切な文字列があるので、それを使用することもできます。これらは標準のヘッダー文字列に含まれています。それらを使用するには #include <string> を使用します。strcat/strcpy バッファー オーバーランはもう発生しません。null ターミネータが失われることはもうありません。面倒な手動メモリ管理はもう必要ありません。適切な値セマンティクスを持つ適切にカウントされた文字列。
C++ には、ブール値を人間が判読できる表現に変換する機能もあります。先ほど iostream の例でそのヒントを見ましたが、テキストをコンソール (または fstream、ファイル) に送信することしかできないため、少し制限されています。幸いなことに、C++ の設計者は完全な愚か者ではありませんでした。コンソールやファイルではなく、自動的に管理される文字列バッファーによってサポートされる iostream もあります。それらはストリングストリームと呼ばれます。#include <sstream> を使用してそれらを取得します。次に、次のように言えます。
std::string bool_as_text(bool b)
{
std::stringstream converter;
converter << std::boolalpha << b; // flag boolalpha calls converter.setf(std::ios_base::boolalpha)
return converter.str();
}
もちろん、実際にはそのすべてを入力するつもりはありません。幸いなことに、C++ には次のような便利なサードパーティ ライブラリもあります。 ブースト それはここで私たちを助けることができます。Boost には lexical_cast という優れた関数があります。次のように使用できます。
boost::lexical_cast<std::string>(my_bool)
確かに、これはマクロよりもオーバーヘッドが高いです。stringstream は、気にしないかもしれないロケールを処理し、動的文字列 (メモリ割り当て付き) を作成しますが、マクロはリテラル文字列を生成できるため、それを回避できます。しかし、逆に言えば、stringstream メソッドは、印刷可能な表現と内部表現の間の非常に多くの変換に使用できます。逆方向に実行することもできます。たとえば、 boost::lexical_cast<bool>("true") は正しいことを行います。これらは数値とともに使用でき、実際には適切な形式の I/O 演算子を備えた任意の型でも使用できます。したがって、それらは非常に多用途で便利です。
そして、これらすべての結果、プロファイリングとベンチマークの結果、lexical_casts が許容できないボトルネックであることが判明した場合は、 それは マクロホラーを検討する必要があるとき。
これで問題ないはずです:
const char* bool_cast(const bool b) {
return b ? "true" : "false";
}
ただし、より C++ っぽくやりたい場合は、次のようにします。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string bool_cast(const bool b) {
ostringstream ss;
ss << boolalpha << b;
return ss.str();
}
int main() {
cout << bool_cast(true) << "\n";
cout << bool_cast(false) << "\n";
}
マクロを使用することに決めた場合 (または将来のプロジェクトで C を使用する場合)、マクロ展開の 'b' の周りに括弧を追加する必要があります (他の人のコンテンツを編集するにはまだ十分なポイントがありません)。
#define BOOL_STR(b) ((b)?"true":"false")
これは 防御的なプログラミング 隠れた操作順序エラーから保護する技術。つまり、これはどのように評価されますか 全て コンパイラ?
1 == 2 ? "true" : "false"
に比べ
(1 == 2) ? "true" : "false"
printf で次のように 3 項を使用します。
printf("%s\n", b?"true":"false");
それをマクロ化すると、次のようになります。
B2S(b) ((b)?"true":"false")
次に、として渡したものを確認する必要があります 'b'
副作用はありません。括弧を忘れないでください 'b'
コンパイルエラーが発生する可能性があるため。
C++11 では、ラムダを使用して、もう少しコンパクトなコードとその場での使用法を取得できます。
bool to_convert{true};
auto bool_to_string = [](bool b) -> std::string {
return b ? "true" : "false";
};
std::string str{"string to print -> "};
std::cout<<str+bool_to_string(to_convert);
プリント:
string to print -> true
この投稿は古いものですが、現在は使用できます std::to_string
多くの変数を次のように変換します std::string
.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
使用 boolalpha
ブール値を文字列に出力します。
std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;
マクロが最適かもしれないという意見には同意します。テスト ケースを作成しました (C/C++ は苦手だと信じてください。でも、これは楽しそうです)。
#include <stdio.h>
#include <stdarg.h>
#define BOOL_STR(b) (b?"true":"false")
int main (int argc, char const *argv[]) {
bool alpha = true;
printf( BOOL_STR(alpha) );
return 0;
}
文字列を char 配列として直接見ることができる限り、それを私に納得させるのは非常に難しいでしょう。 std::string
文字列を C++ の第一級市民として表します。
それに、割り当てと有界性を組み合わせるのは、いずれにしても悪い考えのように思えます。
このマクロを試してください。「true」または false を表示したい場合は、それを PRINTBOOL(var) に置き換えるだけです。var はテキストを表示する bool です。
#define PRINTBOOL(x) x?"true":"false"