2

クラスを出力する2つのモードを持つように2番目の挿入演算子を定義することは可能ですか? たとえば、すべてのメンバーを出力するものと、ログでgrep可能な基本的な一意の識別子を出力するものとしましょうか? もしそうなら、通常選ばれるオペレーターはありますか?それが合法である場合に<<使用する類推として推測しますか?<<<

ありがとう

4

6 に答える 6

3

すでに定義されている、または慣例で使用されているようなもの はありません。

また、C++ で独自の演算子を定義することはできません。既に言語に含まれていてオーバーロード可能な演算子の 1 つを使用する必要があり、 C++ では<<<演算子ではないため、とにかくアウトです。

これには他の演算子を使用しないことを強くお勧めします。(より完全な説明については、こちらのルール #1を参照してください。) 出力操作に微妙な違いがある場合、適切に選択された関数名は、不明確な演算子を恣意的に選択するよりも優れたコードを作成するのに大いに役立ちます。

于 2011-07-27T07:24:03.590 に答える
3

id のみを出力したい場合は、ストリーミング可能な型 (例: ) で id を取得するメソッドを提供することをお勧めしstd::string id() const;ます。これは、奇妙な演算子が使用するよりも、コードに取り組んでいる他の人々にとってはるかに直感的です。

あなたの提案<<<(C++ で新しい演算子を作成することはできませんが、それをしばらく無視することはできません) は、呼び出しの時点で別のコードが存在することに満足していることを示しています。したがって、得られる唯一の利点は、いくつかの文字のソース コードを節約できることです。難読化する価値はありません。

対照的に、ID のみのデータと完全なデータの切り替えや、タグ/値、CSV、XML、バイナリなどの異なる表現の切り替えなど、同じストリーミング表記で異なる動作を呼び出す必要がある場合があります。これらの代替手段は、通常、次のいずれかによって最もよく伝えられます。

  • 異なるストリーム タイプ (例: ではなく XMLStream) を使用し、 etcstd::ostreamを定義する、および/またはXMLStream& operator<<(XMLStream&, const My_Type&)
  • ストリーム マニピュレータを使用 - 独自のものを作成できます - ランダムな Google の結果: http://www.informit.com/articles/article.aspx?p=171014&seqNum=2
于 2011-07-27T07:43:03.630 に答える
2

<<<C++のような演算子はありません。

ただし、たとえば、自由に実装operator <(ostream&,Object&)できます。これは、必要なことを行います。問題は、連結しようとするとコードが読み取れなくなる可能性があること<です<<

于 2011-07-27T07:23:32.560 に答える
2

いいえ。独自の演算子を定義することはできません ( <<<C++ には存在しません)。id()ただし、文字列を返すメソッドを定義してこれを出力することはできます。

于 2011-07-27T07:22:37.240 に答える
1

たとえば、使用できoperator |ます。これを行う別の方法は、演算子がオーバーロードされる小さなタグ クラスを定義することです。例(かなり単純化されていますが、要点はわかります):

template< class T >
struct GrepTag
{
  GrepTag( const T& );
  T value;
}

template< class T >
Greptag< T > MakeGrepTag( const T& x )
{
  return GrepTag< T >( x ); 
}

template< class T >
MyClass& MyClass::operator << ( const GrepTag< T >& g )
{
  //output g.value here
}

MyClass() << MakeGrepTag( "text" );

標準ストリームに似たさらに別の方法として、タグも使用しますが、一部の状態を内部的に保持します。

struct GrepTag
{
}

MyClass& MyClass::operator << ( const GrepTag& g )
{
  grepState = true;
}

template< class T >
MyClass& MyClass::operator << ( const T& )
{
  if( grepState )
  {
    //output special
    grepState = false;
  }
  else
  {
    //output normal
  }        
}

MyClass() << GrepTag() << "text";
于 2011-07-27T07:23:13.383 に答える
0

C++ で独自の演算子を定義することはできません。存在するものだけをオーバーロードできます。

したがって、基本的な一意の識別子 grep-able をログに出力するために演算子を使用しないことをお勧めします。これは、既存のオペレーターの役割には対応していません。などのメソッドを代わりに使用してくださいexportToLog()

于 2011-07-27T07:27:17.353 に答える