C++ C++;流第二插入运算符

C++ C++;流第二插入运算符,c++,stream,operator-keyword,insertion,C++,Stream,Operator Keyword,Insertion,是否可以将第二个插入运算符定义为具有两种输出类的模式?例如,一个输出所有成员,另一个只输出一些基本的唯一标识符,这些标识符在日志中是grep-able的?如果是,是否有通常选择的操作员?我想这与不类似。你不能定义你自己的操作符(你可以使用操作符|例如。另一种方法是定义操作符重载的小标记类;例如(非常简单,但你明白了这一点): 模板 结构格雷普塔 { 格雷普塔格(康斯特&); T值; } 模板 GreptagMakeGrepTag(常数T&x) { 返回GrepTag(x); } 模板 MyCla

是否可以将第二个插入运算符定义为具有两种输出类的模式?例如,一个输出所有成员,另一个只输出一些基本的唯一标识符,这些标识符在日志中是grep-able的?如果是,是否有通常选择的操作员?我想这与
不类似。你不能定义你自己的操作符(
你可以使用
操作符|
例如。另一种方法是定义操作符重载的小标记类;例如(非常简单,但你明白了这一点):

模板
结构格雷普塔
{
格雷普塔格(康斯特&);
T值;
}
模板
GreptagMakeGrepTag(常数T&x)
{
返回GrepTag(x);
}
模板
MyClass和MyClass::operator和g)
{
//此处输出g.value
}

MyClass()没有像
这样的操作符,也没有像这样的东西已经按照惯例定义或使用了


也不能定义C++中的运算符,必须使用语言中的一个,可重载,并且<强> >代码> 不能在C++中定义自己的运算符。你只能让那些已经存在的东西过载


所以我建议不要使用操作符在日志中输出基本的唯一标识符grep-able。这与任何现有操作员角色都不对应。如果您只想输出id,那么最好使用一种方法,例如
exportToLog()

,最好是提供一种方法,以可流化的类型获取id(例如
std::string id()const;
)。对于其他处理代码的人来说,这比一些奇怪的操作员使用更直观


你对
@Alexandre的建议:我现在删除了一些打字错误;你到底指的是什么?我知道,我没有展示完整的类定义,所以它不会编译。虽然这在技术上是正确的,但你可以做到,如果在重载运算符时使用一些合理的语义,其他开发人员和你自己都会很感激。从现在起几个月后,你可能会开始想,一个
ostream
怎么可能比你的
对象小呢。但是,如果他真的想让另一个运营商来实现这一目的——那就是如何实现的。他真的很喜欢这个答案,尤其是使用不同流的可能性!谢谢
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";