是否可以定义第二个插入运算符以具有两种输出类的模式?比如说,一个输出所有成员,一个只输出一些基本的唯一标识符,可以在日志中进行 grep 操作?如果是这样,是否有通常选择的运营商?我猜想如果这是合法的,<<
可以使用一个类比?<<<
谢谢
是否可以定义第二个插入运算符以具有两种输出类的模式?比如说,一个输出所有成员,一个只输出一些基本的唯一标识符,可以在日志中进行 grep 操作?如果是这样,是否有通常选择的运营商?我猜想如果这是合法的,<<
可以使用一个类比?<<<
谢谢
没有这样的东西已经定义或按照惯例使用。
此外,您不能在 C++ 中定义自己的运算符,您必须使用该语言中已经存在且可重载的运算符之一,并且<<<
它不是C++ 中的运算符,因此无论如何它都已淘汰。
我强烈建议您不要为此使用其他运算符。(有关更详尽的解释,请参见此处的规则 #1 。)如果您在输出操作之间存在细微差别,那么与任意选择的不明确的运算符相比,精心选择的函数名称对于编写更好的代码大有帮助。
如果您只想输出 id,那么最好的办法可能是提供一种方法来获取可流式传输的类型的 id(例如std::string id() const;
)。对于其他处理代码的人来说,这比一些奇怪的操作员使用要直观得多。
您的建议<<<
(不可能在 C++ 中创建新的运算符,但暂时忽略)表明您很高兴在调用点有不同的代码。因此,您获得的唯一好处就是节省了一些字符的源代码;不值得混淆。
相比之下,在某些情况下,您希望相同的流式表示法调用不同的行为,例如在仅 id 数据和完整数据之间切换,或者在标签/值、CSV、XML 和二进制等不同表示形式之间切换。这些替代方案通常最好通过以下方式传达:
std::ostream
),并定义XMLStream& operator<<(XMLStream&, const My_Type&)
等,和/或不,您不能定义自己的运算符(<<<
在 C++ 中不存在)。但是您可以定义一个id()
返回字符串的方法并输出它。
没有像<<<
C++ 中那样的运算符。
但是,您可以自由实施,例如operator <(ostream&,Object&)
,这将做您想做的事。问题是,当您尝试链接在一起时,代码可能会变得<
不可读<<
。
例如,您可以使用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()
.