исправляя казнь - PullRequest
       22

исправляя казнь

1 голос
/ 24 апреля 2020

При использовании cout, если оператор cout<<E1<<E2<<E3;, нет никакой гарантии, что E1 E2 и E3 будут выполнены в том же порядке, в котором они записаны.

Что я могу сделать, чтобы убедиться, что они выполняются в том же порядке, в котором они написаны, без записи другого оператора cout или endl между ними?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Если ваш оператор << не переопределен, он будет выполняться в указанном порядке. </p>

cout << E1 

выполняется сначала с типом возврата std :: ostream (если, конечно, мы не играем в игры с другим типом cout. Cout не является ключевым словом C ++ или зарезервированным словом). Этот побочный эффект передается следующему выражению:

cout << E2

Обработка повторяется для следующего аргумента. Я не знаю каких-либо изменений C ++ в приоритет оператора. Я не могу придумать, как поиграть с препроцессором C или поиграть с другими по-настоящему неясными методами перегрузки, где вы могли бы выполнять какие-то нетипичные операции.

0 голосов
/ 24 апреля 2020

Я не уверен, что это лучшее решение (или, по крайней мере, просто хорошее), но вы можете использовать Boost.Preprocessor:

#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>

#define COUT_IMPL(_, __, i) \
  std::cout << (i);
#define COUT(...) \
  BOOST_PP_SEQ_FOR_EACH( \
    COUT_IMPL, \
    _, \
    BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
  );

void use() {
  COUT(e1, e2, e3);
} 

Это заставляет C препроцессор создавать ; - прекращено cout s для вас, обеспечивая гарантированный порядок оценки.

...