портирование ostream :: opfx / osfx с Unix на Linux - PullRequest
1 голос
/ 13 августа 2010

Я портирую некоторый код C ++ из Unix в Linux (Red Hat).

Я столкнулся со следующей схемой:

ostream& myfunction(ostream& os)
{
  if (os.opfx())
  {
    os << mydata;
    os.osfx();
  }
  return os;
}

Функции opfx и osfxнедоступны в Red Hat 4.5.Я видел предложение здесь , чтобы использовать функциональность ostream::sentry:

ostream& myfunction_ported(ostream& os)
{
  ostream::sentry ok(os);
  if (ok)
  {
    os << mydata;
  }
  return os;
}

Я вижу из здесь , что цель opfx состоит в проверке потокасостояние перед сбросом и продолжением.

Мои вопросы:

Я думал, что функции ostream уже проверяли состояние потока перед работой с потоком.Это правда?Разве это не было правдой в какой-то момент?

Требуется ли замена opfx на sentry?Что sentry дает мне то, что operator<< не дает мне уже?

1 Ответ

1 голос
/ 13 августа 2010

Любой существующий инсертер (если он действительно ужасно глючит) уже делает для создания часового объекта, поэтому, пока вы выполняете свою работу через существующий инсертер, вам не нужно создавать часовой объект самостоятельно.

Вам нужно необходимо создать часовой объект, когда вы самостоятельно записываете данные в буфер потока, без помощи какого-либо существующего средства вставки (т. Е. Когда вы не используете ничего, что 'я создам для вас сторож).

Для этого кода вы можете просто полностью исключить создание сторожевых объектов и сделать что-то вроде:

ostream& myfunction(ostream& os)
{
    return os << mydata;
}

Обратите внимание, что существующий код был объявлен возвращаемымostream &, но, похоже, на самом деле ничего не возвращало.

...