Size: a a a

2021 February 14

АК

Александр Караев... in pro.cxx
Lev Khoroshansky
А это не будет оверкиллом?
Это однозначно добавит универсальности. Не могу точно сказать, оверкилл ли. Если не нужно иметь много способов перегрузки или передавать GetAwaiter как функтор - оверкилл.
Можно действительно попробовать начать с требования к пользователю "Специализируй класс, чтобы добавить пользовательскую перегрузку функции Fn". Если это удобно, то флаг в руки.

Но вообще, это очень обширная тема с множеством разных решений под разные задачи. @oficsu, может, добавишь?
источник

AK

Alexey Kuznetsov in pro.cxx
Lev Khoroshansky
Что-то вроде
template <typename Awaitable, typename Awaiter>
struct Helper {
   auto GetAwaiter(Awaitable&& a) -> Awaiter;
};

?
template< typename Awaitable >
struct Helper{
   auto GetAwaiter( Awaitable&& a) -> Awaiter;
};
Возвращаемый тип можно вынуть из темплейта. В специализациях вы все равно явно его укажете всегда
источник

AV

Aleksey Verkholat in pro.cxx
Stepan
Результат является таковым?
да
источник

S

Stepan in pro.cxx
Прикольный трюк
источник

AV

Aleksey Verkholat in pro.cxx
Stepan
Прикольный трюк
я думаю что можно тк standard layout
источник

LA

Liber Azerate in pro.cxx
Dmitriy
Разрешает ли Стандарт делать такое?
struct Tag {
 uint64_t tag1 : 48;
 uint64_t tag2 : 16;
};
Где-то в коде ниже:
Tag t;
...
auto val = *reinterpret_cast<uint64_t*>(&tag);
Да. Можно ещё пару ссылок добавить, но это основное
http://eel.is/c++draft/class.mem#general-27
источник

D

Dmitriy in pro.cxx
Liber Azerate
Да. Можно ещё пару ссылок добавить, но это основное
http://eel.is/c++draft/class.mem#general-27
Меня там смущает if that member is not a bit-field
источник

O

Ofee in pro.cxx
Александр Караев
Это однозначно добавит универсальности. Не могу точно сказать, оверкилл ли. Если не нужно иметь много способов перегрузки или передавать GetAwaiter как функтор - оверкилл.
Можно действительно попробовать начать с требования к пользователю "Специализируй класс, чтобы добавить пользовательскую перегрузку функции Fn". Если это удобно, то флаг в руки.

Но вообще, это очень обширная тема с множеством разных решений под разные задачи. @oficsu, может, добавишь?
@TmLev, я бы добавил, что сильно зависит от объема кодовой базы

Если на всю кодовую базу полторы функции требуют расширения от пользователя, да и пользователей всего несколько – CPO может оказаться и оверкиллом в условиях, когда нет готового инструментария для упрощения их написания. Для начала я бы взял tag_invoke – уже готовое решение, а потому позволит влиться в тему и понять, нужно ли что-то сложнее. Пока ещё чего-то заметно мощнее tag_invoke не появилось или я не знаю об этом

Но если и функций, и пользователей много – можно и повелосипедить, особенно, если интересно
источник

LA

Liber Azerate in pro.cxx
Dmitriy
Меня там смущает if that member is not a bit-field
Оу, ну. Видимо нет, значит :) У меня эта ссылка была под рукой, ибо недавно проверял вопрос, а про битфилды не помнил
источник

АК

Александр Караев... in pro.cxx
Liber Azerate
Да. Можно ещё пару ссылок добавить, но это основное
http://eel.is/c++draft/class.mem#general-27
Эм.. но это объяснение лишь того, что указатель на начало структуры - это указатель на её первый мембер. Как это связано с тем, что можно собирать uint64 из двух кусков? ЕМНИП, никак не специфицировано даже то, что два битовых поля по 48+16 бит будут занимать 8 байт
источник

LA

Liber Azerate in pro.cxx
Александр Караев
Эм.. но это объяснение лишь того, что указатель на начало структуры - это указатель на её первый мембер. Как это связано с тем, что можно собирать uint64 из двух кусков? ЕМНИП, никак не специфицировано даже то, что два битовых поля по 48+16 бит будут занимать 8 байт
Тут я согласен. Моя ошибка. Но, пожалуй, биткаст решит точно в данном случае. Если есть С++20
источник

D

Dmitriy in pro.cxx
Александр Караев
Эм.. но это объяснение лишь того, что указатель на начало структуры - это указатель на её первый мембер. Как это связано с тем, что можно собирать uint64 из двух кусков? ЕМНИП, никак не специфицировано даже то, что два битовых поля по 48+16 бит будут занимать 8 байт
Не специфицировано, но все имеющиеся реализации делали и делают именно так (для x64) - поля 48 + 16 занимают один uint64_t
источник

LA

Liber Azerate in pro.cxx
Dmitriy
Не специфицировано, но все имеющиеся реализации делали и делают именно так (для x64) - поля 48 + 16 занимают один uint64_t
В целом, это вопрос именно на strict aliasing получается, и ответ нет с реинтерпретом, но с биткастом нормально получится, ну или через type punning, наверно, если нет С++20
источник

LA

Liber Azerate in pro.cxx
Главное гарантировать корректные размеры, собственно
источник

D

Dmitriy in pro.cxx
Liber Azerate
В целом, это вопрос именно на strict aliasing получается, и ответ нет с реинтерпретом, но с биткастом нормально получится, ну или через type punning, наверно, если нет С++20
Ах да. unaligned_load через memcpy. Спасибо!
источник

LK

Lev Khoroshansky in pro.cxx
@lexxisor @smertig @oficsu спасибо огромное за помощь!
Мне пока что нужно переварить
tag_invoke
, потом попробую каждый из предложенных методов и напишу
источник
2021 February 15

AP

Alexander Potapov in pro.cxx
источник

S

Stas in pro.cxx
Выглядит как да. Дефолтный конструктор отсутствует, а потому должно вернуться false.
источник

AP

Alexander Potapov in pro.cxx
if constexpr примененный на НЕ шаблонный параметр работает как обычный if => код не должен компилится? или лямбда зависит от внешней шаблонной функции?
источник

LA

Liber Azerate in pro.cxx
Alexander Potapov
if constexpr примененный на НЕ шаблонный параметр работает как обычный if => код не должен компилится? или лямбда зависит от внешней шаблонной функции?
Лямбда зависит, но if constexpr не обычный if, должно компилироваться
источник