是否可以定义第二个插入运算符以具有两种输出类的模式?比如说一个输出所有成员,一个只输出一些基本的唯一标识符,在日志中是grep-able?如果是这样,是否有通常选择的运营商?我想与<<
类似,如果这是合法的,可以使用<<<
吗?
由于
答案 0 :(得分:3)
没有 此类内容已按惯例定义或使用。
此外,您无法在C ++中定义自己的运算符,您必须使用其中一种语言并且可重载,而 <<<
不是运算符 在C ++中,所以无论如何它都是。
我强烈建议您 不要使用其他操作符 。 (有关更详细的说明,请参阅rule #1 here。)如果输出操作之间存在细微差别, 精心选择的函数名称 可以帮助您制作出更好的代码比不清楚的运营商任意挑选。
答案 1 :(得分:3)
如果您只想输出id,那么最好的想法可能是提供一种方法来获取可流式传输类型的id(例如std::string id() const;
)。对于处理代码的其他人而言,这比使用一些奇怪的操作员更直观。
您对<<<
的建议(不可能在C ++中创建新的运算符,但暂时忽略它)表明您很高兴在通话点有不同的代码。因此,您获得的唯一好处是保存一些角色的源代码;这是不值得的混淆。
通过对比,在某些情况下,您希望相同的流表示法调用不同的行为,例如在仅id和完整数据之间切换,或者使用不同的表示形式,如标记/值,CSV,XML和二进制。这些替代方案通常最好通过以下方式进行沟通:
std::ostream
),定义XMLStream& operator<<(XMLStream&, const My_Type&)
等,和/或答案 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()
。