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

Сообщение Re[5]: Разреженный массив в compile-time от 20.07.2018 16:52

Изменено 20.07.2018 16:55 Croessmah

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

V>А я бы вот докопался все таки


Докопаться всегда можно и приятно. )))

V>1. Метод sum — сначала конструируется пустой результат а затем наполняется значениями. Почему сразу не конструировать с нужными значениями?


Да, можно и так:

template<typename R, typename F, typename S, std::size_t ... Indexes>
constexpr R sum(F && f, S && s, std::index_sequence<Indexes...>)
{        
    return {(f.template get<Indexes>() + s.template get<Indexes>())...};
}


V>2. Метод get своим именем как бы намекает, что с его помощью нужно "получать". А на практике, с его помощью можно еще и модифицировать. Такой get должен называться как нибудь типа at


Так мы и получаем, либо ссылку на существующий элемент, либо копию значения по-умолчанию.
В защиту себя могу сказать, что я не знаю английский язык.
В защиту get могу привести в пример std::get, а не std::at.


V>3. operator+ получился не консэкспр, хотя таковым обозначен


Убрать из конструктора и деструктора вывод, на operator+ навесить const, переменные в main сделать constexpr и готово, дело-то минута.
https://wandbox.org/permlink/WhI4fSswxfzRNPxT
Re[5]: Разреженный массив в compile-time
Здравствуйте, vopl, Вы писали:

V>А я бы вот докопался все таки


Докопаться всегда можно и приятно. )))

V>1. Метод sum — сначала конструируется пустой результат а затем наполняется значениями. Почему сразу не конструировать с нужными значениями?


Да, можно и так:

template<typename R, typename F, typename S, std::size_t ... Indexes>
constexpr R sum(F && f, S && s, std::index_sequence<Indexes...>)
{        
    return {(f.template get<Indexes>() + s.template get<Indexes>())...};
}


V>2. Метод get своим именем как бы намекает, что с его помощью нужно "получать". А на практике, с его помощью можно еще и модифицировать. Такой get должен называться как нибудь типа at


Так мы и получаем, либо ссылку на существующий элемент, либо копию значения по-умолчанию.
В защиту себя могу сказать, что я не знаю английский язык.
В защиту get могу привести в пример std::get, а не std::at.


V>3. operator+ получился не консэкспр, хотя таковым обозначен


Убрать из конструктора и деструктора вывод, на operator+ навесить const, переменные в main сделать constexpr и готово, дело-то минута.
https://wandbox.org/permlink/KWzCCxayORVCTagc