2016-09-29 3 views
0

私は心の中で、これは.cppファイルで使用する必要があります。これは文字列をこのように比較するのに適したスタイルですか?

namespace 
{ 
    bool operator==(char const* const a, char const* const b) noexcept 
    { 
     return !::std::strcmp(a, b); 
    } 
} 

はこの良いスタイルですか?

EDIT:

私は同じことを達成++ 1Z方法、上品cは、比較のための新しいstd::string_viewクラスを使用することだと思います。

+0

それは純粋に意見に基づいていますが、私は少なくともそのような構成で混乱していました。 IMHO、 'strcmp(a、b)== 0'が良いです。 – Leon

+4

これはまったくコンパイルされますか? IIRCでは、組み込み型の演算子オーバーロードを提供することはできません。 –

+0

私は '!std :: strcmp(a、b)'を使い慣れていない構築物に隠そうとするのではなく、そのまま使用します。 '=='と '' const char * ''を同じように使用すると、セマンティクスが変更されます。それはたぶん違法だ。 – Galik

答えて

11

classまたはenumをオペランドとすることはできません。つまり、組み込み型で動作する動作を変更することはできません。

演算子が式に含まれ、オペランドの少なくとも1つにクラス型または列挙型がある場合、オーバーロード解決が使用されるすべての関数の中で呼び出されるユーザー定義関数を決定するために使用されます。シグネチャは、次の一致:

は、私はあなたがoperator==を提供char*std::string inteadを、使用することをお勧めします。次に、std::strcmp()とそのような種類のCスタイルの文字列関数をまったく使用しないようにすることができます。 Cスタイルの文字列が必要な場合は、std::basic_string::c_str()を使用して必要に応じて変換することができます。

+0

char const *の使用を避けることはできません。たとえば、サードパーティライブラリを使用する必要がある場合。 – user1095108

+0

'char const *'の変換コンストラクタを使ってダミーのクラスを書くことができました。 – user1095108

+0

@ user1095108必要に応じて 'std :: string'に対して' c_str() 'を使うことができます。 – songyuanyao

関連する問題