Open romasandu-gaijin opened 1 year ago
А почему вы считаете что эта проверка должна быть внутри, а не снаружи?
void foo(int x);
bool foo_is_valid_input(int x);
@kov-serg я не считаю, я беру это за предпосылку. Такой код уже есть, и с ним как-то нужно жить и ловить баги.
@vtopunov это близко, но в геймдеве исключения запрещены по религиозным причинам, поэтому хочется всё таки аналог ассёрта, то есть контракт.
@vtopunov это близко, но в геймдеве исключения запрещены по религиозным причинам, поэтому хочется всё таки аналог ассёрта, то есть контракт.
template<class T, class U>
constexpr T narrow(U value) noexcept
{
assert(std::in_range<T>(value));
return static_cast<T>(value);
}
`
@vtopunov это близко, но в геймдеве исключения запрещены по религиозным причинам, поэтому хочется всё таки аналог ассёрта, то есть контракт.
template<class T, class U>
constexpr T narrow(U value) noexcept
{
assert(std::in_range<T>(value));
return static_cast<T>(value);
}
`
Ну да, но операция эта настолько частая, что хочется иметь в стандарте кошерный способ её проводить. Особенно всякие касты между signed и unsigned.
На горизонте контракты. В связи с этим хочется автоматизировать довольно часто встречающийся на практике отрывок кода:
Обычно такое выходит, когда "по дефолту" в публичных интерфейсах ставят простые типы, а потом оказывается, что на самом деле хватит 16 или даже 8 бит, имплементацию меняют для экономии памяти/перфа, а публичное АПИ менять нельзя (не хочется, сложно, ...). Но кажется и другие кейсы не сложно придумать.
Идея следующая:
Таким образом получаем явную передачу намерения "я точно знаю, что должно влезть, приведение по модулю 2^n -- ошибка", плюс автоматическую ловлю багов в режиме проверки контрактов в рантайме.