Используйте Promise.resolve
- он возьмет любой последующий, как обещание от какой-либо другой реализации, и ассимилирует его в обещание Bluebird.
Имейте в виду, что термин «разрешение» может вводить в заблуждение, это не означает то же самое, что «выполнить», но также может следовать другому обещанию и соглашаться на его результат.
std::streambuf * buf;
std::ofstream of;
if(!condition) {
of.open("file.txt");
buf = of.rdbuf();
} else {
buf = std::cout.rdbuf();
}
std::ostream out(buf);
, Который связывает базовый streambuf или суда или потока выходного файла к. После этого можно записать в, и это закончится в правильном месте назначения. Если Вы просто хотите это, все идущее в std::cout
входит в файл, можно также сделать
std::ofstream file("file.txt");
std::streambuf * old = std::cout.rdbuf(file.rdbuf());
// do here output to std::cout
std::cout.rdbuf(old); // restore
, Этот второй метод имеет недостаток, что это не безопасное исключение. Вы возможно хотите записать класс, который делает это использование RAII:
struct opiped {
opiped(std::streambuf * buf, std::ostream & os)
:os(os), old_buf(os.rdbuf(buf)) { }
~opiped() { os.rdbuf(old_buf); }
std::ostream& os;
std::streambuf * old_buf;
};
int main() {
// or: std::filebuf of;
// of.open("file.txt", std::ios_base::out);
std::ofstream of("file.txt");
{
// or: opiped raii(&of, std::cout);
opiped raii(of.rdbuf(), std::cout);
std::cout << "going into file" << std::endl;
}
std::cout << "going on screen" << std::endl;
}
Теперь, что бы ни случилось, станд.:: суд находится в чистом состоянии.
Это безопасно от исключения:
void process(std::ostream &os);
int main(int argc, char *argv[]) {
std::ostream* fp = &cout;
std::ofstream fout;
if (argc > 1) {
fout.open(argv[1]);
fp = &fout;
}
process(*fp);
}
<час> Редактирование: Herb Sutter обратился к этому в статье , Переключающей Потоки (Гуру Недели) .