クラスを出力する2つのモードを持つように2番目の挿入演算子を定義することは可能ですか? たとえば、すべてのメンバーを出力するものと、ログでgrep可能な基本的な一意の識別子を出力するものとしましょうか? もしそうなら、通常選ばれるオペレーターはありますか?それが合法である場合に<<
使用する類推として推測しますか?<<<
ありがとう
クラスを出力する2つのモードを持つように2番目の挿入演算子を定義することは可能ですか? たとえば、すべてのメンバーを出力するものと、ログでgrep可能な基本的な一意の識別子を出力するものとしましょうか? もしそうなら、通常選ばれるオペレーターはありますか?それが合法である場合に<<
使用する類推として推測しますか?<<<
ありがとう
すでに定義されている、または慣例で使用されているようなもの はありません。
また、C++ で独自の演算子を定義することはできません。既に言語に含まれていてオーバーロード可能な演算子の 1 つを使用する必要があり、 C++ では<<<
演算子ではないため、とにかくアウトです。
これには他の演算子を使用しないことを強くお勧めします。(より完全な説明については、こちらのルール #1を参照してください。) 出力操作に微妙な違いがある場合、適切に選択された関数名は、不明確な演算子を恣意的に選択するよりも優れたコードを作成するのに大いに役立ちます。
id のみを出力したい場合は、ストリーミング可能な型 (例: ) で id を取得するメソッドを提供することをお勧めしstd::string id() const;
ます。これは、奇妙な演算子が使用するよりも、コードに取り組んでいる他の人々にとってはるかに直感的です。
あなたの提案<<<
(C++ で新しい演算子を作成することはできませんが、それをしばらく無視することはできません) は、呼び出しの時点で別のコードが存在することに満足していることを示しています。したがって、得られる唯一の利点は、いくつかの文字のソース コードを節約できることです。難読化する価値はありません。
対照的に、ID のみのデータと完全なデータの切り替えや、タグ/値、CSV、XML、バイナリなどの異なる表現の切り替えなど、同じストリーミング表記で異なる動作を呼び出す必要がある場合があります。これらの代替手段は、通常、次のいずれかによって最もよく伝えられます。
std::ostream
を定義する、および/またはXMLStream& operator<<(XMLStream&, const My_Type&)
<<<
C++のような演算子はありません。
ただし、たとえば、自由に実装operator <(ostream&,Object&)
できます。これは、必要なことを行います。問題は、連結しようとするとコードが読み取れなくなる可能性があること<
です<<
。
いいえ。独自の演算子を定義することはできません ( <<<
C++ には存在しません)。id()
ただし、文字列を返すメソッドを定義してこれを出力することはできます。
たとえば、使用でき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";
C++ で独自の演算子を定義することはできません。存在するものだけをオーバーロードできます。
したがって、基本的な一意の識別子 grep-able をログに出力するために演算子を使用しないことをお勧めします。これは、既存のオペレーターの役割には対応していません。などのメソッドを代わりに使用してくださいexportToLog()
。