C ++ stream второй оператор вставки - PullRequest
2 голосов
/ 27 июля 2011

Можно ли определить второй оператор вставки, чтобы иметь два режима вывода класса? Скажем, например один, который выводит всех членов, а другой, который просто выводит некоторый базовый уникальный идентификатор, который можно записывать в журнале? Если да, то есть ли оператор, который обычно выбирается? Я думаю, что в качестве аналогии с << можно использовать <<<, если это допустимо?

Спасибо

Ответы [ 6 ]

3 голосов
/ 27 июля 2011

Если вы хотите вывести только идентификатор, то, вероятно, лучше всего предоставить метод для получения идентификатора в типе, который можно преобразовать (например, std::string id() const;).Это гораздо более интуитивно понятно для других людей, работающих над кодом, чем использование какого-то странного оператора.

Ваше предложение <<< (невозможно создать новые операторы в C ++, но на мгновение игнорируем это) показывает, что вырады, что в точке вызова будет другой код.Следовательно, единственным преимуществом, которое вы получите, будет сохранение исходного кода из нескольких символов;это не стоит запутывания.

В отличие от этого, существуют ситуации, когда вы хотите, чтобы одна и та же потоковая нотация вызывала различные варианты поведения, такие как переключение между только идентификатором и полными данными, или разные представления, такие кактег / значение, CSV, XML и двоичный файл.Эти альтернативы обычно лучше всего сообщать либо:

  • с использованием различных типов потоков (например, XMLStream, а не std::ostream) и определением XMLStream& operator<<(XMLStream&, const My_Type&) и т. Д., И / или
  • с использованием потокаманипуляторы - вы можете создать свой собственный - случайный результат Google: http://www.informit.com/articles/article.aspx?p=171014&seqNum=2
3 голосов
/ 27 июля 2011

Существует нет такая вещь уже определена или используется соглашением.

Кроме того, вы не можете определить свои собственные операторы в C ++, вы должны использовать один из тех, которые уже есть в языке и перегружаются, и <<< не является оператором в C ++, так что в любом случае.

Я бы настоятельно рекомендовал вам не использовать какой-либо другой оператор для этого. (См. правило # 1 здесь для более подробного объяснения.) Если у вас есть небольшие различия между операциями вывода, правильно выбранные имена функций имеют большое значение для создание лучшего кода, чем произвольно выбранные неясные операторы.

2 голосов
/ 27 июля 2011

В C ++ нет такого оператора как <<<.

Однако вы можете свободно реализовать, например, operator <(ostream&,Object&), который будет делать то, что вы хотите.Проблема в том, что код может стать нечитаемым, когда вы попытаетесь соединить < и << вместе.

2 голосов
/ 27 июля 2011

Нет. Вы не можете определить свои собственные операторы (<<< не существует в C ++). Но вы можете определить метод id(), возвращающий строку, и вывести его.

1 голос
/ 27 июля 2011
Например,

вы можете использовать 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";
0 голосов
/ 27 июля 2011

Вы не можете определить свои собственные операторы в C ++. Вы можете перегрузить только те, которые существуют.

Поэтому я не рекомендую использовать оператор для вывода базового уникального идентификатора, который может быть отображен в журнале. Это не соответствует какой-либо существующей роли оператора. Вместо этого используйте метод, такой как exportToLog().

...