array[index];
}
-------------------------
Нужно ли создавать перегрузку для int индекса?
Задача 2:
Дано:
template<typename T>
class A {
...
using ConstReturnType = ?;
ConstReturnType get(std::size_t index) const {
return _pointer[index];
}
}
-------------------------
Как получить ConstReturnType такой чтобы например для маленьких типов возвращалось значение, а для больших референсов: что-то типо такого подойдет:
using ConstReturnType = typename std::conditional<sizeof(T) < sizeof(const T&), typename std::conditional<std::is_trivially_copyable<T>::value, T, const T&>::type, const T&>::type
?
Подумайте о том, знаете ли вы, как будете обрабатывать отрицательные индексы, пришедшие в функцию
1. Нет, кажется, даже если на проекте приняты знаковые индексы. 2. Можно сделать conditional, но скорее бесполезно
P. S. всё-таки likeThis_ лучше _likeThis, напрягают подчеркивания префиксом
А, да, с размером ссылки бесполезно сравнивать, лучше с char*
Что касается второго вопроса — насчёт полной корректности конструкции не скажу, но должен указать на некоторые детали Во-первых, я могу заверить, что static_assert(sizeof(const T&) == sizeof(T)); и такая проверка не имеет смысла. Стоит сравнивать с sizeof(void*) Во-вторых, почему мы требуем, чтобы тип был строго меньше? Возможно, равный по размеру тип тоже подойдёт? В-третьих, стандартная библиотека вполне полагается на то, что std::string_view следует принимать по значению, а это два указателя В-четвёртых — зубодробительный код вроде typename conditional<B, T, U>::type с C++14 упрощается до conditional_t<B, T, U>. А is_trivially_copyable<T>::value с C++17 до is_trivially_copyable_v<T> уж не говоря о том, что не нужно один conditional вкладывать в другой, когда у нас есть замечательный operator&& В итоге, я бы отталкивался от чего-то такого: template<typename T> using ConstReturnType = std::conditional_t< sizeof(T) <= sizeof(void*) && std::is_trivially_copyable_v<T>, T, const T&>; Но вовсе не факт, что это вам хоть как-то поможет выиграть в производительности
Ты аргумент и возврат путаешь немного
Мог ошибиться, пока писал это полотно текста, что именно стоит исправить?
Ты говоришь что 2 потому что string_view лезет, но это же аргумент, а не возвращаемое значение
Да, немного подправил текст, пусть будет так
Ну и философский вопрос, void* или int*
Обсуждают сегодня