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

时间:2011-07-27 07:20:29

标签: c++ stream operator-keyword insertion

是否可以定义第二个插入运算符以具有两种输出类的模式?比如说一个输出所有成员,一个只输出一些基本的唯一标识符,在日志中是grep-able?如果是这样,是否有通常选择的运营商?我想与<<类似,如果这是合法的,可以使用<<<吗?

由于

6 个答案:

答案 0 :(得分:3)

没有 此类内容已按惯例定义或使用。

此外,您无法在C ++中定义自己的运算符,您必须使用其中一种语言并且可重载,而 <<<不是运算符 在C ++中,所以无论如何它都是。

我强烈建议您 不要使用其他操作符 。 (有关更详细的说明,请参阅rule #1 here。)如果输出操作之间存在细微差别, 精心选择的函数名称 可以帮助您制作出更好的代码比不清楚的运营商任意挑选。

答案 1 :(得分:3)

如果您只想输出id,那么最好的想法可能是提供一种方法来获取可流式传输类型的id(例如std::string id() const;)。对于处理代码的其他人而言,这比使用一些奇怪的操作员更直观。

您对<<<的建议(不可能在C ++中创建新的运算符,但暂时忽略它)表明您很高兴在通话点有不同的代码。因此,您获得的唯一好处是保存一些角色的源代码;这是不值得的混淆。

通过对比,在某些情况下,您希望相同的流表示法调用不同的行为,例如在仅id和完整数据之间切换,或者使用不同的表示形式,如标记/值,CSV,XML和二进制。这些替代方案通常最好通过以下方式进行沟通:

答案 2 :(得分:2)

没有。您无法定义自己的运算符(C ++中不存在<<<)。但是你可以定义一个id()方法返回一个字符串并输出它。

答案 3 :(得分:2)

C ++中没有<<<这样的运算符。

然而,你可以自由地实施,例如operator <(ostream&,Object&),它可以做你想要的。问题是,当您尝试将<<<链接在一起时,代码可能无法读取。

答案 4 :(得分: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";

答案 5 :(得分:0)

您无法在C ++中定义自己的运算符。你只能重载那些存在的东西。

所以我建议不要使用运算符在日志中输出基本唯一标识符grep-able。这与任何现有的运营商角色都不对应。请改用方法,例如exportToLog()