Меня интересует использование оператора init для if / switch с "заполнителями" или чем-то в этом роде, которые передаются в функцию в качестве параметров out или in-out, например, T f(X& x)
.
Например, «совершенно новый» C ++ 17 noexcept overloads в std::filesystem
использует параметр out для передачи std::error_code
по ссылке:
bool create_directory(const std::filesystem::path& p,
const std::filesystem::path& existing_p,
std::error_code& ec) noexcept;
или
void rename(const std::filesystem::path& old_p,
const std::filesystem::path& new_p,
std::error_code& ec) noexcept;
Для функции, возвращающей код ошибки вместо передачи его в качестве параметра out, я бы написал (псевдокод):
namespace fs = std::filesystem;
if (auto ec = fs::rename(old_p, new_p); ec)
{
// use ec handle error
} // ec's lifetime ends
Вместо этого я не могу использовать его с оператором init в моем if
предложение:
namespace fs = std::filesystem;
std::error_code ec;
fs::rename(old_p, new_p, ec);
if (ec)
{
// handle error
}
// ec is still there
На самом деле, я работаю над этим, используя обертку для поддержания кода вызывающего абонента в чистоте:
namespace fs = std::filesystem;
inline std::error_code wrap_rename_ec(const fs::path& old_p,
const fs::path& new_p) noexcept
{
std::error_code ec;
fs::rename(old_p, new_p, ec);
return ec;
}
int main (void)
{
if (auto ec = wrap_rename_ec("old_p", "new_p"); ec)
{
// use ec to handle error
} // ec's lifetime ends
}
Мне бы хотелось использовать что-то подобное (псевдокод):
namespace fs = std::filesystem;
if (std::error_code ec, fs::rename(old_p, new_p, ec); ec)
{
// handle error
} // ec's lifetime ends
Я мог бы использовать другую перегрузку std::filesystem::rename
, которая выдает filesystem_error
при ошибке, но передача существующего пути или имени файла в качестве нового пути или имени файла не должна бытьошибка, которая должна нарушить поток управления в программе, я, возможно, хочу добавить "(2) "или что-то, потому что я жду этого случая, который не является исключением.
Примечание: мой вопрос направлен не на обсуждение использования исключений по кодам ошибок или наоборот.; -)
Я не уверен, были ли учтены случаи, подобные описанному выше, при описании выражений init для if / switch или были отброшены, хотя по крайней мере для меня это было быприятно найти элегантный способ без функций-оболочек, обрабатывающих параметры out / in-out с помощью операторов init для if / switch.
TL; DR: Какой самый элегантный способ получения прибыли от операторов init дляПереключатель if / в сочетании с параметрами out / in-out?Возможно ли это вообще?
С уважением, FA85