Ioann_
Я тоже не уверен. Но вроде как все возможно.
Constantine
Для потоковых операций отдельные сущности
Berkus
Constantine
На самом деле, stream-режим это полностью отдельная тема
Constantine
Эта штука возникает когда надо просто прочитать файл, и 146% его можно последовательно в память уложить
Berkus
но зачем там бросать исключение если можно вернуть result? который 100% надо будет обработать
Berkus
если ты уж так беспокоишься что его не обработают
Berkus
Result<T,E> кодится за 15 минут с нуля если лень брать готовое
Nik
Я мимокрокодил, но есть же std::variant, он не подойдет?
Berkus
неа
Constantine
ну у меня на самом деле реализация через чтение мегабайтными блоками, но не суть
Constantine
пользователю этой функции совершенно точно не нужен стрим-режим
Constantine
хм... интересно, насколько упоротой будет иерархия коллбеков с подстановками поведения по умолчанию
Constantine
например, потом этот файл прочитают как utf-8 и пихнут в xml parser, который сообщит что инпут не xml
Berkus
прости, я не понимаю что ты пишешь. слова по отдельности вроде бы понятные - а все вместе полная фигня
Berkus
что значит исключение не обработают потому что файл пустой?
Berkus
если файл пустой не будет исключения? или что?
Berkus
тогда расскажи в каких именно случаях ты бросаешь исключения а в каких - нет
Berkus
чтение пустого файла, очевидно, не ошибка
Constantine
"как правило" означает, что не всегда
Berkus
но с result это поведение легко сделать ошибкой
Berkus
смотри
Berkus
auto content = readFile("file_may_be_empty.txt").fail_on_empty("This file is empty");
Constantine
я бы хотел, чтобы было
auto content = readFile("file.bin");
static_assert(std::is_same<decltype(content), std::vector<uint8_t>>::value, "");
Ivan
В компайл тайме файл прочитать?
Berkus
Constantine
нет, это пример, что не нужно заменять возвращаемое значение readFile
Berkus
Berkus
не вижу причины НЕ заменять возвращаемое значение readFile если так будет удобнее
🐙 Antony
ну а почему нет
Есть такой proposal http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0373r0.pdf
The content of datafile.txt:
The quick brown fox jumps over the lazy dog.
The content of main.cc:
#include <iostream>
int main() {
std::cout << tF”datafile.txt”;
}
The program outputs:
The quick brown fox jumps over the lazy dog.
Ivan
Ну давай ещё в сокеты читать/писать в компайл тайме.
Ivan
Во во
Constantine
xy-problem?
Смотри. 90% пользователей считают, что пустой файл является ошибкой и обработают её в любом случае. И им совершенно не сдалось выяснять, что же на самом деле пошло не так у функции readFile
Ivan
У вас вместо программы эти же действия будет делать компилятор, но зачем?
Berkus
Berkus
100% пользователей получат от readFile Result<T,E> и несколько функций как его обрабатывать:
- похуй пляшем .unwrap()
- дефолтно .expect("Failed to read")
- непустое .fail_on_empty("File is empty - string may be optional")
Berkus
Все эти функции либо возвращают T либо падают или бросают эксепшены разной степени тяжести
Ivan
А нельзя проще
readFile("name", error_code)
Constantine
Berkus
Berkus
не напишут - конпелятор напомнит
Ivan
readFile(const string& name, ErrorCode& errcode)
Constantine
не умрут, напишут
50 раз, из них 40 раз будет unwrap и игнорирование результата
Constantine
Berkus
назови правильно .ignore() или как-то так и сразу будет видно кто и где игнорирует
Berkus
Constantine
ну окай, .ignore
Berkus
с дизайном у тебя явно проблемы
Constantine
?
Constantine
зачем мне специализировать ошибку чтения файла, если я все равно не смогу вытащить ее наверх пользователю программы
Ivan
Я не очень понял, а что код ошибки нельзя пробросить?
Berkus
Ioann_
Можно бы(просто нету средств), почему нет ? Только работать это будет только там где компилировалось
Ivan
int a[] = { #include array.txt.h }
Ioann_
Ну это сарказм был. Просто я когда то давно думал, а почему CT нельзя узнать количество потоков на машине...
Constantine
Constantine
Я полагаю, что речь идет о возврате "значение либо исключение"
Constantine
смотри, например, дальше будет вызов loadStringDecode() и поедет сигнатура loadString
Constantine
Я не понимаю, нах мне переделывать сигнатуру функции под обязательную обработку ошибки
Constantine
Если я как раз хочу этого избежать :)
Constantine
Я хочу кастомизировать поведение функции при ошибке (это нужно в 10% случаев)
Ivan
Constantine
Ivan
Ээ
Berkus
не парьтесь, он сам разберется
Berkus
сделает хуевый велосипед и успокоится
Berkus
зато все 100мб клиентов будут довольны
Constantine
ну ладно, со 100 я перегнул, вроде) там что-то вроде 500к строк
Ivan
не парьтесь, он сам разберется
Кстати, ты же ассемблерный код читаешь. Расскажи, switch за О(1) или за О(N) находит нужный case. https://godbolt.org/g/h7pnAK
Berkus
ну и как ты думаешь, нужны нам все 500к строк? или работающего примера хватит?
Berkus
Andrei
Какая разница? Условия-то надо всё равно все перебрать.