Size: a a a

2020 November 04

IA

Ilia Abernikhin in pro.cxx
С жосткого диска?
источник

АР

Андрей Руссков... in pro.cxx
он векторизует в пару movups'ов
источник

IA

Ilia Abernikhin in pro.cxx
Там обращения дорогостоящие
источник

АР

Андрей Руссков... in pro.cxx
ну если с совсем жосткого диска, то там всё равно есть промежуточный буфер
источник

АР

Андрей Руссков... in pro.cxx
просто апи обычно не позволяет в него писать в обход этого апи
источник

O

Oleksandr in pro.cxx
Есть такой вот код (MWE), который принимает указатель на метод в качестве шаблонного параметра: https://godbolt.org/z/59n13P

Проблема в том, что некоторые типы (int, double, enum etc.) в принципе не могут иметь методов. Как следствие компилятор ругается на такой код, даже если add_method никогда не вызывается (—> шаблон не инстанциируется). Есть ли какой-то изящный способ это пофиксить? Можно конечно для типов с методами и типов без методов завести свой TypeInfoBuilder с/без add_method, потом их как-то отнаследовать чтобы не дублировать код, как-то решить проблему с возвращаемым типом билдера (через CRTP?)... Но все это выглядит дико громоздко. Есть ли какой-то более изящный способ? С enable_if или специализацией?
источник

m

magras in pro.cxx
Oleksandr
Есть такой вот код (MWE), который принимает указатель на метод в качестве шаблонного параметра: https://godbolt.org/z/59n13P

Проблема в том, что некоторые типы (int, double, enum etc.) в принципе не могут иметь методов. Как следствие компилятор ругается на такой код, даже если add_method никогда не вызывается (—> шаблон не инстанциируется). Есть ли какой-то изящный способ это пофиксить? Можно конечно для типов с методами и типов без методов завести свой TypeInfoBuilder с/без add_method, потом их как-то отнаследовать чтобы не дублировать код, как-то решить проблему с возвращаемым типом билдера (через CRTP?)... Но все это выглядит дико громоздко. Есть ли какой-то более изящный способ? С enable_if или специализацией?
Помимо enable_if есть if constexpr и концепты.
источник

O

Oleksandr in pro.cxx
magras
Помимо enable_if есть if constexpr и концепты.
К сожалению моя компания использует очень старый компилятор, который даже C++11 не полностью поддерживает, поэтому не вариант :)
А можно пример как бы эта задача решалась на if constexpr или концептах?
источник

m

magras in pro.cxx
Oleksandr
К сожалению моя компания использует очень старый компилятор, который даже C++11 не полностью поддерживает, поэтому не вариант :)
А можно пример как бы эта задача решалась на if constexpr или концептах?
Кажется я не прав и достаточно простого static_assert, но это потребовало переноса member из nttp в аргументы функции. Мне не удалось придумать изящную реализацию оригинального интерфейса с использованием C++20.

https://godbolt.org/z/7MEhj7
источник

O

Oleksandr in pro.cxx
К сожалению перенос метода в аргументы функции тоже не вариант по ряду причин, мне он нужен в compile-time контексте. Может в будущем это поменяется, но пока вот так.

Тем временем я попробовал пофиксить проблему через CRTP: https://godbolt.org/z/WbEqT7 . Слегка громоздко, но на первое время пойдет.
источник

NP

Nikita Provotorov in pro.cxx
Oleksandr
Есть такой вот код (MWE), который принимает указатель на метод в качестве шаблонного параметра: https://godbolt.org/z/59n13P

Проблема в том, что некоторые типы (int, double, enum etc.) в принципе не могут иметь методов. Как следствие компилятор ругается на такой код, даже если add_method никогда не вызывается (—> шаблон не инстанциируется). Есть ли какой-то изящный способ это пофиксить? Можно конечно для типов с методами и типов без методов завести свой TypeInfoBuilder с/без add_method, потом их как-то отнаследовать чтобы не дублировать код, как-то решить проблему с возвращаемым типом билдера (через CRTP?)... Но все это выглядит дико громоздко. Есть ли какой-то более изящный способ? С enable_if или специализацией?
есть вариант попроще с C++17: https://godbolt.org/z/j1n5Tf

есть посложнее с C++11:
https://godbolt.org/z/q4o7qr
источник

O

Oleksandr in pro.cxx
Спасибо, решение с C++11 выглядит неплохо!
источник
2020 November 05

AK

Anton Kviatkovskii in pro.cxx
Народ, а есть ли какой то профит использовать в этом коде std::string_view вместо const std::string&  ?
struct Foo {
 std::string str;
 std::string_view get_str() const {
   return str;
 }
};
источник

D

Danya in pro.cxx
Anton Kviatkovskii
Народ, а есть ли какой то профит использовать в этом коде std::string_view вместо const std::string&  ?
struct Foo {
 std::string str;
 std::string_view get_str() const {
   return str;
 }
};
const auto str = foo.get_str();
Не будет лишнего копирования при таком коде
источник

AK

Anton Kviatkovskii in pro.cxx
Danya
const auto str = foo.get_str();
Не будет лишнего копирования при таком коде
Ну это скорее выглядит как ошибка разработчика, который не вставил auto&
источник

D

Danya in pro.cxx
А что лучше — лишний раз скопировать, чтобы не стрельнуть в ногу или не копировать — надо смотреть по ситуации
источник

AF

Aidar Fattakhov in pro.cxx
Danya
А что лучше — лишний раз скопировать, чтобы не стрельнуть в ногу или не копировать — надо смотреть по ситуации
да просто если лень смотреть в хедер пишешь везде const auto& и всё, а в голове держишь что foo его вероятно хранит
источник

АК

Александр Караев... in pro.cxx
Anton Kviatkovskii
Народ, а есть ли какой то профит использовать в этом коде std::string_view вместо const std::string&  ?
struct Foo {
 std::string str;
 std::string_view get_str() const {
   return str;
 }
};
Скорее нет, т.к. строка во вьюху конвертируется, а обратно уже нет (без копий)
источник

АР

Андрей Руссков... in pro.cxx
для геттера лучше возвращать по ссылке имо. С одной стороны можно тупануть и сделать лишнее копирование, с другой - если какой-то метод попросит const string&, то string_view придется в него конвертировать
источник

АР

Андрей Руссков... in pro.cxx
т.е. лишней копии можно избежать, а дополнительной - нет
источник