Alexander
должно помочь если тип тоже запихнуть в тот же неймспейс, тогда указывать do_it можно будет без неймспейса, и он будет искаться в том числе в неймспейсе типа
Constantine
Александр
Constantine
Constantine
это требование
Constantine
ADL работает через MSVS name lookup
Constantine
Constantine
пример посмотри
Constantine
https://godbolt.org/g/wKHYJ8
Constantine
давай так если непонятно
Александр
вот это всё меняет
Constantine
ну это как std::swap / std::begin / std::end
Alexander
это как std::iostream операторы перегружать, та же логика. Ложить перегрузку надо в том же неймспейсе, что и тип новый
Constantine
или как operator « да
Constantine
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
Александр
Александр
на самом деле, есть небольшой легаси проект с кастомной сериализацией, которую хотелось бы расширить. и вынужден писать под 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
Александр
плюс у меня чисто бинарная сериализация на little endian
Constantine
а, мне нужна с секционированием для в том числе чтение user-writable xml
Александр
для таких вещей лучше брать всякие бусты и прочие либы. я ж сразу сказал - пишу очень специфичную)
Constantine
мне не нравится бустовая
Александр
cereal/protobuf?
Constantine
Constantine
Constantine
Александр
Constantine
т.е.?
ну там выше пример, комментируешь первый static_assert начинает все работать, а ошибка в третьем
Constantine
т.е.?
https://godbolt.org/g/G2cvZ3
примерно так должно выглядеть
Anatoliy
Matwey
Господа, а в std::function нет никаких аналогов SSO?
Constantine
Matwey
Ура
Constantine
Багу нашел?)
Nikita
кстати а как реализуется копирование таких маленьких объектов?
Constantine
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
Igor
Alexander "SonnySlave"
Constantine
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;
};