たぶんこれはばかげた質問かもしれませんが、1 が「真」になり、0 が「偽」になるように、ブール値を文字列に変換する方法はありますか? if ステートメントを使用することもできますが、言語または標準ライブラリでそれを行う方法があるかどうかを知っておくとよいでしょう。さらに、私は衒学者です。:)
16 に答える
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;
}
乾杯 :)
@DrPizza:この単純な関数のために、ブーストライブラリ全体を含めますか?冗談でしょ?
C ++には適切な文字列があるため、それらを使用することをお勧めします。それらは標準のヘッダー文字列にあります。それらを使用するには、#include<string>を使用します。strcat/strcpyバッファオーバーランはもうありません。nullターミネータが欠落することはもうありません。面倒な手動メモリ管理はもう必要ありません。適切な値のセマンティクスを持つ適切なカウント文字列。
C ++には、boolを人間が読める形式に変換する機能もあります。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という名前の便利なサードパーティライブラリもあり、ここで役立ちます。Boostにはlexical_castと呼ばれる素晴らしい関数があります。したがって、次のように使用できます。
boost::lexical_cast<std::string>(my_bool)
さて、これはいくつかのマクロよりもオーバーヘッドが高いと言っても過言ではありません。文字列ストリームは、気にしない可能性のあるロケールを処理し、(メモリ割り当てを使用して)動的文字列を作成しますが、マクロはリテラル文字列を生成できるため、それを回避できます。しかし逆に、stringstreamメソッドは、印刷可能な表現と内部表現の間の非常に多くの変換に使用できます。'emを逆方向に実行できます。たとえば、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で三項を使用します。
printf("%s\n", b?"true":"false");
マクロ化する場合:
B2S(b) ((b)?"true":"false")
'b'
次に、渡すものに副作用がないことを確認する必要があります。'b'
コンパイルエラーが発生する可能性があるため、括弧を忘れないでください。
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;
}
std::string
文字列を char 配列として直接表示できる限り、C++ で文字列を第一級市民として表現することを私に納得させるのは非常に難しいでしょう。
その上、割り当てと境界を組み合わせることは、とにかく私には悪い考えのようです。
このマクロを試してください。「true」または「false」を表示したい場所はどこでも、それを PRINTBOOL(var) に置き換えるだけです。ここで、var はテキストが必要な bool です。
#define PRINTBOOL(x) x?"true":"false"