Александр
все норм, просто вызываешь do_it
так я хочу расставить SFINAE по has_do_it
Alexander
должно помочь если тип тоже запихнуть в тот же неймспейс, тогда указывать do_it можно будет без неймспейса, и он будет искаться в том числе в неймспейсе типа
Александр
Constantine
это требование
Constantine
ADL работает через MSVS name lookup
Александр
параметр do_it и специализация do_it кладется в один namespace
ну это хреново. предположим, class B в одной либе, namespace serialization - в этой. Юзер хочет сделать сериализацию для B. Сам класс он не сможет подредактировать, переместить - тоже
Constantine
пример посмотри
Александр
пример посмотри
я посмотрел. там class B внутри foo
Constantine
https://godbolt.org/g/wKHYJ8
Constantine
давай так если непонятно
Александр
вот это всё меняет
Constantine
ну это как std::swap / std::begin / std::end
Alexander
это как std::iostream операторы перегружать, та же логика. Ложить перегрузку надо в том же неймспейсе, что и тип новый
Constantine
или как operator « да
Александр
ну это как std::swap / std::begin / std::end
про перегрузку понятно, я только сейчас увидел отличие в foo::do_it -> do_it
Constantine
точнее можно, но это должен быть прокси-вызов
Александр
думаю, я осознал. спасибо большое :)
Constantine
типа template <typename... Args> decltype(auto) foo::run_do_it(Args&&... args) { using foo::std_port::do_it; return do_it(std::forward<Args>(args)...); }
Constantine
видимо, вот так и придется писать, если есть реализации для классов std
Constantine
думаю, я осознал. спасибо большое :)
сгодь, чочочоч, ты там сериализацию пишешь?
Constantine
чёрт, спалился
ну я хотеть libserialize17
Александр
на самом деле, есть небольшой легаси проект с кастомной сериализацией, которую хотелось бы расширить. и вынужден писать под gcc-4.9, так что 17-ми не будет пахнуть даже
Constantine
а чо там есть?
Constantine
я просто писал прототипы, но остро подвис
Constantine
https://pastebin.com/n2Z6adYK https://pastebin.com/pGFpgFZp
Александр
в сериализации? ну я сделал себе под требования - без всякого там версионирования, с поддержкой STL и расширения для классов в виде кастомных функций или методов. struct Foo { int a, b; MAKE_SERIALIZABLE(a, b); } ничего сверхкрутого по сравнению с существующими нет
Anatoliy
name lookup from within each definition finds the same entities (after overload-resolution), except that constants with internal or no linkage may refer to different objects as long as they are not ODR-used and have the same values in every definition.
у вас есть готовый пример, где использование incomplete type в decltype приводит к ODR violation? Чтобы очевидно было. Чтобы в двух юнитах выводилось два разных адреса.
Александр
плюс у меня чисто бинарная сериализация на little endian
Constantine
а, мне нужна с секционированием для в том числе чтение user-writable xml
Александр
для таких вещей лучше брать всякие бусты и прочие либы. я ж сразу сказал - пишу очень специфичную)
Constantine
мне не нравится бустовая
Александр
cereal/protobuf?
Constantine
cereal/protobuf?
потом почитаю
Constantine
т.е.?
ну там выше пример, комментируешь первый static_assert начинает все работать, а ошибка в третьем
Constantine
т.е.?
https://godbolt.org/g/G2cvZ3 примерно так должно выглядеть
Anatoliy
Александр
https://godbolt.org/g/G2cvZ3 примерно так должно выглядеть
ну в моём примере, к счастью, проблемы за компайл-тайм не выйдут
Matwey
Господа, а в std::function нет никаких аналогов SSO?
Constantine
Господа, а в std::function нет никаких аналогов SSO?
Есть с рождения такая же оптимизация
Matwey
Ура
Constantine
Багу нашел?)
Nikita
кстати а как реализуется копирование таких маленьких объектов?
Nikita
мы же тип не знаем
Constantine
знаем
Nikita
видимо там не совсем тривиальный SSO)
Constantine
у нас на самом деле под std::function лежит struct function_control_block_interface { }; template <typename T> struct function_control_block_implementation: function_control_block_interface { };
Anonymous
Привет я новинки в С++. Как я могу начать изучение С++
Alexander "SonnySlave"
да это скорее какой-то Small Object Optimization (SOO)
Constantine
у нас на самом деле под std::function лежит struct function_control_block_interface { }; template <typename T> struct function_control_block_implementation: function_control_block_interface { };
так вот, и как раз инстанс этого интерфейса на самом деле либо кладется в объект function, либо выделяется в куче
Constantine
где T фактический тип хранимого объекта
Nikita
ну это вы говорите про классический type erasure
Constantine
ну там оно и есть
Constantine
копирование/перемещение std::function отправляется на function_control_block_interface
Nikita
а всё я понял, тут виртуальные функции зарешают опять
Constantine
перемещение только в случае если внутреннее, разумеется
Nikita
я сначало было подумал что функтор прямо в указатель запихается без дополнительных обёрток
Nikita
в случае SSO
Constantine
нет, в случае SSO не будет memory allocation
Constantine
т.е. new не вызовут
Nikita
я это понимаю
Constantine
точнее вызовут, но placement, который конструктор
Constantine
оверхед все равно будет
Nikita
просто в указатель запихается функтор, обёрнутый в function_control_block_interface
Constantine
угу
Constantine
только не в указатель
Nikita
вот, а я подумал сначала что без этой обёртки
Nikita
ну там какой нибудь aligned union пади
Constantine
там struct function { std::aligned_storage storage; function_control_block_interface * control_block; };