2

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

谢谢

4

6 回答 6

3

没有这样的东西已经定义或按照惯例使用。

此外,您不能在 C++ 中定义自己的运算符,您必须使用该语言中已经存在且可重载的运算符之一,并且<<<它不是C++ 中的运算符,因此无论如何它都已淘汰。

我强烈建议您不要为此使用其他运算符。(有关更详尽的解释,请参见此处的规则 #1 。)如果您在输出操作之间存在细微差别,那么与任意选择的不明确的运算符相比,精心选择的函数名称对于编写更好的代码大有帮助。

于 2011-07-27T07:24:03.590 回答
3

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

您的建议<<<(不可能在 C++ 中创建新的运算符,但暂时忽略)表明您很高兴在调用点有不同的代码。因此,您获得的唯一好处就是节省了一些字符的源代码;不值得混淆。

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

于 2011-07-27T07:43:03.630 回答
2

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

于 2011-07-27T07:22:37.240 回答
2

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

但是,您可以自由实施,例如operator <(ostream&,Object&),这将做您想做的事。问题是,当您尝试链接在一起时,代码可能会变得<不可读<<

于 2011-07-27T07:23:32.560 回答
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 回答