Использование оператора << при предоставлении аргумента для функций - PullRequest
1 голос
/ 12 марта 2012

Я программировал сетевой симулятор ns3, написанный на c ++. Существует множество функций для условной регистрации выходных данных в зависимости от конфигурации системы. (т. е. инструкция для регистрации сообщения всегда есть, но если я отключу отладку, некоторые сообщения не появятся).

Вызов одной из этих функций может выглядеть следующим образом:

int n=42;  
NS_LOG_LOGIC("the answer is " << n);

Это чрезвычайно полезно, поскольку позволяет мне напрямую объединять много разных видов данных в одну строку для регистрации.

Теперь я пытаюсь написать свою собственную функцию ведения журнала, чтобы дать мне больше контроля над тем, где регистрируются сообщения, и чтобы я мог вставлять уникальный идентификатор и метку времени перед каждым сообщением, чтобы я знал, откуда и когда оно пришло.

У меня такой вопрос: как мне создать функцию в c ++, которая может быть вызвана таким образом? Я не могу найти источник для показанной функции и не видел других примеров таких функций.

Примечание. Обычная конкатенация '+' недостаточно хороша, поскольку я хочу иметь возможность легко объединять несколько типов данных. Я знаю, что есть другие способы сделать это, но я также просто хочу выяснить, что происходит в функции выше!

Спасибо:)

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Вот способ сделать это. Он выведет выражение на стандартный вывод, если определено DEBUG. Предполагается #include <iostream>.

#ifdef DEBUG
#  define NS_LOG_LOGIC( expr ) \
      std::cout << expr << std::endl;  // or "\n" instead of endl if performance matters more than reliability
#else
#  define NS_LOG_LOGIC( expr )
#endif

EDIT

Как правильно заметил Тони:

  • std::endl напечатает новую строку и очистит ваш буфер, это будет медленнее, но вы получите больше гарантии того, что ваши журналы были записаны в случае сбоя. \n просто печатает новую строку, буфер не очищается.
  • использование обозначения do { ... } while(false) помогает повысить надежность макросов.
0 голосов
/ 12 марта 2012

Простой класс string Builder может быть полезен в сценариях конкатенации такого рода - даже в более общем случае, когда вам нужно передать конечную строку в качестве аргумента или что-то в этом роде (то есть, не просто записать ее в журнал).

Пример реализации см., Например: https://stackoverflow.com/a/5770312/19254

...