Информация об изменениях

Сообщение Re: Разреженный массив в compile-time от 05.07.2018 14:21

Изменено 05.07.2018 14:42 vopl

Re: Разреженный массив в compile-time
Здравствуйте, avovana, Вы писали:

A>Дорогие форумчане, здравствуйте!


A>

3. В чем прошу помощи.


A>Прошу помочь с реализацией operator+.
A>То что я сделал, к сожалению, не компилируется.
A>Ошибка в попытке использования объекта в выражение std::index_sequence.
A>Не получается всё в compile-time сделать.
A>Описал конкретно эту проблему здесь.

A>


У тебя попутались индексы и значения, одно смешалось с другим, надо там навести марафет. В общем — коллизия примерно такого плана: индексы — они нормально перерабатываются в compile-time, а вот хранимые значения — не очень, вот и образуется ругань от компилятора, мол ‘this’ is not a constant expression когда ты пытаешся значение засунуть в compile-time константу...

operator+ для с++17:
  не подсматривать
    constexpr static uint8_t countIndex(uint8_t entityNumber) { // обратный к countEntityNumber
        uint8_t idx = 0;
        while(countEntityNumber(idx) <= entityNumber) {
            idx++;
        }

        return idx-1;
    }

    template<typename TOther, uint64_t MaskOther>
    constexpr auto operator +(const SparseArray<TOther, MaskOther>& other) const {
        using Result = SparseArray<decltype(T{} + TOther{}), Mask | MaskOther>;

        return [this, other]<uint8_t... EntityNumbers>(std::integer_sequence<uint8_t, EntityNumbers...>)
        {
            return Result{(get<Result::countIndex(EntityNumbers)>() + other.template get<Result::countIndex(EntityNumbers)>())...};
        }(std::make_integer_sequence<uint8_t, Result::size>{});
    }

Re: Разреженный массив в compile-time
Здравствуйте, avovana, Вы писали:

A>Дорогие форумчане, здравствуйте!


A>

3. В чем прошу помощи.


A>Прошу помочь с реализацией operator+.
A>То что я сделал, к сожалению, не компилируется.
A>Ошибка в попытке использования объекта в выражение std::index_sequence.
A>Не получается всё в compile-time сделать.
A>Описал конкретно эту проблему здесь.

A>


У тебя попутались индексы и значения, одно смешалось с другим, надо там навести марафет. В общем — коллизия примерно такого плана: индексы — они нормально перерабатываются в compile-time, а вот хранимые значения — не очень, вот и образуется ругань от компилятора, мол ‘this’ is not a constant expression когда ты пытаешся значение засунуть в compile-time константу...

А именно:
неправильно: результатСложения -> integer_sequence -> конструкторРезультата
правильно: результатСложения -> конструкторРезультата

operator+ для с++17:
  не подсматривать
    constexpr static uint8_t countIndex(uint8_t entityNumber) { // обратный к countEntityNumber
        uint8_t idx = 0;
        while(countEntityNumber(idx) <= entityNumber) {
            idx++;
        }

        return idx-1;
    }

    template<typename TOther, uint64_t MaskOther>
    constexpr auto operator +(const SparseArray<TOther, MaskOther>& other) const {
        using Result = SparseArray<decltype(T{} + TOther{}), Mask | MaskOther>;

        return [this, other]<uint8_t... EntityNumbers>(std::integer_sequence<uint8_t, EntityNumbers...>)
        {
            return Result{(get<Result::countIndex(EntityNumbers)>() + other.template get<Result::countIndex(EntityNumbers)>())...};
        }(std::make_integer_sequence<uint8_t, Result::size>{});
    }