Здравствуйте, avovana, Вы писали:
A>Дорогие форумчане, здравствуйте!
A>
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>{});
}
|
| |