ЙажаСценарий / Говнокод #27434 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
function t_undef(s?: string)
{
	assert((s == undefined) == true, "is not undefined")
	assert((s != undefined) == false, "is undefined")
	assert((s >  undefined) == false, "not >");
	assert((s <  undefined) == false, "not <");
	assert((s >= undefined) == true, "not >=");
	assert((s <= undefined) == true, "not <=");
}

function t_val(s?: string)
{
	assert((s == undefined) == false, "is undefined")
	assert((s != undefined) == true, "is not undefined")
	assert((s >  undefined) == true, ">");
	assert((s <  undefined) == false, "<");
	assert((s >= undefined) == true, ">=");
	assert((s <= undefined) == false, "<=");
}

function f(s?: string)
{
	print(s == undefined, s != undefined, s > undefined, s < undefined, s >= undefined, s <= undefined);
}

function main() {
	f();
	t_undef();
	f("asd");
	t_val("asd");
}

внеочередной говнокод для работы с андефами. А ваш говно-компилятор умеет так (особенно С и С++)

гы гы

Запостил: ASD_77 ASD_77, (Updated )

Комментарии (30) RSS

    • а можно убрать -std=c++2a и что будет? т.е. что бы звпилить optional надо было целый новый компилятор делать?
      Ответить
      • Можно переключить на -std=c++17, или даже откатиться на -std=c++03 и пользоваться optional из бустятины.
        Ответить
      • Считали, что optional и прочее в стандартной либе нахуй не нужен. За 20 лет решили всё-таки стандартизировать половину буста
        Ответить
        • Сначала они тебя не замечают, потом смеются над тобой, потом.. )

          Кстати, как он работает? Занимает в памяти sizeof(pituh) плюс флажок "petuh_exists", и там в питухе либо настоящий питух, либо мусор?
          Ответить
          • Да. Очень грубо (без noexcept'ов, constexpr'ов, деструктора, std::launder и прочего):
            template<typename T>
            class Optional {
            public:
                template<typename... Args>
                void emplace(Args &&... args) {
                    new (cast()) T(std::forward<Args>(args)...);
                    has_value_v = true;
                }
                
                bool has_value() {
                    return has_value_v;
                }
                
                T & value() {
                    if (!has_value()) {
                        throw nyh_value_error();
                    }
                    return *cast();
                }
                
            private:
                T *cast() {
                    return reinterpret_cast<T*>(&data);
                }
            
                std::aligned_storage_t<sizeof(T), alignof(T)> data;
                bool has_value_v = false;
            };
            Ответить
            • > if (!has_value()) {
              > throw nyh_value_error();
              зачем мне лишняя проверка?

              Пусть пользователь проверяет has_value сам, иначе UB

              Я так примерно и представлял вощем, спасибо)

              В C# давным давно завезли Nullable (он же "?"), позволющий value type быть нулом.
              Но я боюсь, что там тупо кладут его в кучу и заменяют на указатель
              Ответить
              • Ну да, проверка ня нужна. В MS CRT optional сделали через union, кстати:
                template <class _Ty>
                struct _Optional_destruct_base<_Ty, false> { // either contains a value of _Ty or is empty (non-trivial destructor)
                    union {
                        _Nontrivial_dummy_type _Dummy;
                        remove_const_t<_Ty> _Value;
                    };
                    bool _Has_value;
                
                    ~_Optional_destruct_base() noexcept {
                        if (_Has_value) {
                            _Destroy_in_place(_Value);
                        }
                    }
                
                    constexpr _Optional_destruct_base() noexcept : _Dummy{}, _Has_value{false} {} // initialize an empty optional
                
                    template <class... _Types>
                    constexpr explicit _Optional_destruct_base(in_place_t, _Types&&... _Args)
                        : _Value(_STD forward<_Types>(_Args)...), _Has_value{true} {} // initialize contained value with _Args...
                
                    _Optional_destruct_base(const _Optional_destruct_base&) = default;
                    _Optional_destruct_base(_Optional_destruct_base&&)      = default;
                    _Optional_destruct_base& operator=(const _Optional_destruct_base&) = default;
                    _Optional_destruct_base& operator=(_Optional_destruct_base&&) = default;
                
                    void reset() noexcept {
                        if (_Has_value) {
                            _Destroy_in_place(_Value);
                            _Has_value = false;
                        }
                    }
                };
                Ответить
              • > В C# давным давно завезли Nullable (он же "?"), позволющий value type быть нулом.
                > Но я боюсь, что там тупо кладут его в кучу и заменяют на указатель
                Nullable — это на самом деле структура, а структура — value type. Когда наллаблу присваивается null, это на самом деле значит, что это Nullable<T> (где T — value-type), у которого HasValue=false, а при попытке получить Value выбрасывается эксепшен. Хранится ли он в стеке или в куче — это уже отдельный вопрос, как и для любого другого value type.
                Ответить
                • а, ну то есть там именно такой Optional и получается: реально данные и булевый флажок

                  Всё как в С+

                  А вот в джавке бы так не получилось, бо метапррограммирования нету(
                  Ответить
                  • Есть генерики, Object и ссылочность всего. Был бы флажок, Object value и функция, кастующая объект к нужному классу.
                    Ответить
                    • В джаве да. Это значит, что обычный int превратился бы во враппер Integer в куче. Жуткий оверхед.

                      Забавно, что в C# они не забоялись, и сделали генерики ближе к шаблонам: Petuh<int> это реальный класс с полем int, а не с полем Object
                      Ответить
          • В теории, да. Возможно, какие-то кокомпиляторы умеют флаг куда-нибудь в padding прятать.
            Ответить
  • > андефами
    > особенно С
    #define WISDOM 42
    cowsay(WISDOM);
    #undef WISDOM
    Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8