vladislav
ну по сути то же самое
vladislav
только определено будет в другом месте
Anatoly
если речь о том, чтобы обязать выполнять нечно перед return, то почему не изменить протокол с приватными функциями и обязать вместо int возвращать ResultCodeSetter
Anatoly
?
Constantine
а если мне нужен не MoveConstructible параметр из scope, мне вложение строить каждый раз?
Александр
каждый выход из функции ОБЯЗАН указать значение
можно сделать возвращаемое значение типа struct Foo, лямбду auto ret = [&](auto res) { err_code = res; return Foo{}; }; и тогда вернуться из функции можно будет только через return ret(-1);
Constantine
так-то понятно, что я могу написать auto вместо void и сказать auto end_function = [&](int return_code) -> std::integral_constant<int, __LINE__> { /*use everything I want*/ return {}; };
Александр
ну вот
Крылатый
Чо нашёл! https://github.com/stlab/libraries
Constantine
ну вот
а если у меня функция должна не void вернуть, а осмысленное значение?
Александр
Constantine
да, только теперь у меня нет возможности блокировать явный возврат
Constantine
std::tuple?
std::tuple<auto, int> в каком стандарте компильнется?
Sergey
это как вообще, лол
Constantine
я о том же
Igor
чёт ум за разум заходит уже, зачем auto, вроде ж речь шла про то чтобы переписать 👇, не?
Igor
void SomeFunction() { if (path1) { exit_code = 1; return; } if (path2) { exit_code = 2; return; } if (path3) { exit_code = 3; return; } }
Constantine
текущий чит auto SomePublicFunction(); //impl auto end_function = [&](int return_code) -> std::integral_constant<int, __LINE__> { /*use everything I want*/ return {}; }; if (path1) return end_function(1);
Igor
только для функции с типом вместо void
Constantine
и аналогичный чит не сработает, если возврат был не void
vladislav
шото я совсем перестал понимать
Constantine
что тут непонятного? мне нужен SCOPE_EXIT, требующий параметр при EXIT
Constantine
деструктор с параметром меня бы устроил :) (нет)
Igor
а параметр будет определён в процессе выполнения функции?
Constantine
а параметр будет определён в процессе выполнения функции?
параметр зависит от ветки возврата, так что да
Arseny
что тут непонятного? мне нужен SCOPE_EXIT, требующий параметр при EXIT
Непонятно чем плох вариант с функцией или лямбдой. Но чисто гипотетически вопрос любопытный.
Constantine
Непонятно чем плох вариант с функцией или лямбдой. Но чисто гипотетически вопрос любопытный.
грубо говоря, мне приходится делать построение с новым скоупом и лямбдой, чтобы захватить параметры правильно
Igor
локально для функции определить класс с деструктором и параметром, создать объект, начать выполнять ветки, дойти до конца, проинициализировать параметр в объекте и вернуть что нужно?
Constantine
void func(){ SomeNotMCType object; return_code = [&]() -> int { }(); return_code = object.remap(return_code); }
Igor
или в деструкторе тоже нужно завязываться на происходящее в ветках?
Constantine
ну это немного изврат
Aidar
выносмозга-ориентированное программирование
Constantine
вот что-то такое
Constantine
почему блин плюсам нельзя предоставить формальное доказательство, что данный std::unique_ptr в данной точке будет nullptr и чтобы в этом случае плюсы не синтезировали вызов десктрутора? :(
Крылатый
+
Constantine
нужны dependent types
что это и с чем едят?
Алдар
что это и с чем едят?
новая наркота
Constantine
О! Да это же то, о чем я всю жизнь мечтал
Vladislav
что это и с чем едят?
https://en.wikipedia.org/wiki/Curry%E2%80%93Howard_correspondence
Алдар
https://t.me/haskellru
Алдар
как раз тут idris обсуждают с зависимыми типами
Constantine
я не хочу программировать на хаскеле, я хочу определить struct unique_ptr { constexpr bool magic_word not_null() const { return inner != nullptr; } constexpr bool magic_word surely_null() const { return inner == nullptr; } surely_null unique_ptr(nullptr_t) { inner = nullptr; } ~unique_ptr() { delete inner; } ~unique_ptr() surely_null { } }; и потом писать not_null unique_ptr ptr = make_unique();
Constantine
такое можно подмутить на шаблончиках, но слегка упорешься
Constantine
хуже того, есть проблема, что я не могу изменить тип переменной внутри метода
ttldtor
как вообще оно у тебя в блоке nullptr стало?
ttldtor
а... всё ок
ttldtor
не знаю, как у тебя, а у меня /// Destructor, invokes the deleter if the stored pointer is not null. ~unique_ptr() noexcept { auto& __ptr = std::get<0>(_M_t); if (__ptr != nullptr) get_deleter()(__ptr); __ptr = pointer(); }
Constantine
я примерчик пишу
Constantine
и я хочу, чтобы { unique_ptr ptr = nullptr; } //deleter не вызван и не инстанцирован
ttldtor
а где он вызывается?
Constantine
вот так даже
Constantine
потому что ежу понятно, что в этом месте указатель будет на nullptr
ttldtor
зачем ты пишешь deleter-ы, которые нельзя инстанцировать?)
Anatoly
это информация рантайма
Anatoly
в любой момент я могу написать ptr.reset(new T);
Constantine
это информация рантайма
В языке C++ есть cv-qualifier. Если дописать в язык C++ еще один такой же user-defined qualifier, ничего не сломается
Anatoly
но пу сути это уже совсем другой интерфейс должен быть, а не то что предоставляет unique_ptr
Anatoly
напиши null_unique_ptr который не будет требовать deletor
Constantine
напиши null_unique_ptr который не будет требовать deletor
и выяснится, что я не могу модифицировать тип объявленной переменной
ttldtor
ты плюсы путаешь с другим языком, в котором можно модифицировать типы переменных
Constantine
я ничего не путаю, нет ни одной причины, по которой компилятор не может вычислять аналог user-defined cv-qualifier на этапе компиляции с модификацией фактического типа переменной
Anatoly
но ему по сути надо проследить дальшейшие цепочки, в которых используется этот объект, чтобы убедится в том, что нелегальных вызовов нет, в которых потребуется деструктор
Constantine
ему нужно будет вычислить фактический qualifier на момент вызова деструктора
Constantine
после чего выполнить вызов функции точно так же, как производится выбор функции при наличии cv
Крылатый
Просто вам нужен Haskell
Constantine
мне не нужен хаскель
ttldtor
хаскель ему не поможет
Constantine
я думаю, что существуют причины, по которым есть примерно 0 серьезных проектов на хаскеле
ttldtor
какая ложь...
Крылатый
Constantine
какая ложь...
в списке applications на википедии целых 7
ttldtor
опенсорс?
Constantine
хочу увидеть проект на больше 10М кода на хаскеле
ttldtor
folly только студией собирается? Кто-нибудь пробовал msys2 ?
ttldtor
на х-ле не нужно столько кода писать, бро