Dmitry
Дайте галочку? Две, на третий столик пжалста...
Constantine
Ладно, тогда я вас не понимаю
Constantine
Я уже потратил 21 день на изучение С++ и немного умею пользоваться шаблонами
Constantine
И моя проблема все еще состоит в том, что я не умею алиасить имена функций
Constantine
Умею только перевызывать
Constantine
Потому что с точки зрения языка имя функции является значением типа
Dmitry
Проблема пока всё равно не ясна.
Constantine
Проблема: я не могу сделать для функции альтернативное имя, я могу её только перевызвать
Dmitry
Зачем функции альтернативное имя? Хочется чтобы она была first class object?
Constantine
Для того, чтобы не писать полное имя функции
Constantine
Точно так же, как классам иногда нужно альтернативное имя, чтобы не писать их полное имя
Dmitry
Хорошие классы не стесняются своего полного имени.
Constantine
Вы представляете, сколько раз шаблонный using используется в std?
Dmitry
using aaaa::bbbbb::cccc:: function?
Constantine
такого синтаксиса в С++ нет
Dmitry
Почему?
Constantine
не знаю
Constantine
а, такой есть
Constantine
это альтернатива using namespace
Dmitry
using std::swap
Constantine
а вот сокращения template <bool test, typename result> using enable_if_t = typename enable_if<test, result>::type; ой как не зря придумали
Dmitry
И про это я упоминал :)
Constantine
Спасибо, а я-то и не знал до этого, что такое бывает
Constantine
(сарказм)
Constantine
Вот к сожалению, так НЕЛЬЗЯ сделать для имени функции
Dmitry
а что есть перевызов?
Constantine
перевызов это inline auto aliased_name() { return not_aliased_name(); }
Dmitry
auto f() { return g(); }
Constantine
все-таки inline, но не суть
Constantine
это требует полного копирования списка параметров это не работает, если not_aliased_name перегружена и аргументы не могут быть форварднуты
Dmitry
Есть интерфейс с длинными именами.
Dmitry
utils::global::
Constantine
это неймспейс
Dmitry
Который лень писать
Constantine
лень писать всю конструкцию utils::global::read_resource<utils::global::main_thread_events_controller_interface>
Dmitry
Есть namespace aliases
Dmitry
Есть using
Constantine
using на namespace или имя из неймспейса в h файле это расстрел ноги
Dmitry
в локальном using namespace ничего плохого нет
Constantine
в локальном это в каждой функции
Constantine
спасибо
Constantine
очень сильно сократило код)
Dmitry
Если сильно много функций
Constantine
вместо utils::global::read_resource<utils::global::main_thread_events_controller_interface😠) буду писать using namespace utils::global; read_resource<main_thread_events_controller_interface>()
Dmitry
ug() { utils::global::read_....
Dmitry
Это совсем библиотечная функция?
Dmitry
proxy std forwar,f
Constantine
?
Constantine
вы же знаете, что perfect forwarding аргументов работает не всегда?
Dmitry
Да понял, перегрузка, не запроксить...
Constantine
Как только речь идет о выражении, смысл которого определяется результирующим типом, perfect forwarding не работает
Constantine
Например, {} вызов конструктора или взятие адреса перегруженной функции
Constantine
Первое встречается бесконечно раз чаще
Dmitry
И что, там прям много вариаций read_resource?
Constantine
ой, да таких примеров namespace details { template <typename TInterface, typename TConcrete, typename... TArguments> std::enable_if_t< sfinae::is_constructible_from<TConcrete, std::string>::value, std::unique_ptr<TInterface> > create_and_load_concrete_serializable(std::string const& tag, section_storage_interface & storage, TArguments&&... arguments) { std::unique_ptr<TInterface> object = std::make_unique<TConcrete>(tag); object->serialize(storage, std::forward<TArguments>(arguments)...); return object; } template <typename TInterface, typename TConcrete, typename... TArguments> std::enable_if_t< !sfinae::is_constructible_from<TConcrete, std::string>::value, std::unique_ptr<TInterface> > create_and_load_concrete_serializable(std::string const& tag, section_storage_interface & storage, TArguments&&... arguments) { std::unique_ptr<TInterface> object = std::make_unique<TConcrete>(); object->serialize(storage, std::forward<TArguments>(arguments)...); return object; } }
Dmitry
А, для удобства всё уже и так запроксировано, тогда только страдать...
Constantine
BUNCH OF TROLLS! чета у меня пригорело
Constantine
вот почему, скажите мне, почему нельзя реализовать std::unique_ptr::~unique_ptr() { reset(); }
Constantine
http://llvm.org/svn/llvm-project/libcxx/trunk/include/memory ~unique_ptr() { reset(); } http://eel.is/c++draft/unique.ptr.single.dtor#2 Effects: If get() == nullptr there are no effects. Otherwise get_­deleter()(get())
🐙 Antony
@antoshkka научите слать дефект репорты http://eel.is/c++draft/lower.bound#2 ошибочно: *j < value правильно: std::less<> () (*j, value); реализации std в ms и clang вызывают std::less. имеется разница в < и std::less для указателей http://eel.is/c++draft/expr.rel#3 http://eel.is/c++draft/comparisons#2
Вот тут есть мануал http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html Я слал пару недель назад репорт - мне всё ещё не ответили, так как там завал и все готовятся к собранию
Constantine
тут, собственно, второй подъехал
Constantine
MSC проявил внезапное точное следование стандарту и убил мне ногу
Constantine
Зачем?
Потому что reset() гарантированно сначала сбросит указатель и только потом вызовет deleter
Constantine
Собственно я поймал в ногу, что у меня reset объекта вызван по стеку в результате срабатывания его деструктора
Vitaly
@webreh а почему не задефайнить макрос под функцию твою?
Alexander "SonnySlave"
https://github.com/fenbf/AwesomePerfCpp
Alexander "SonnySlave"
https://github.com/conan-io/conan/releases/tag/1.1.0
Berkus
санитайзеры ловить должны
санитайзер в рантайме, как он compile-time оптимизацию поймает? Статический анализатор надо использовать, и -Wall -Wextra -Werror
Vsevolod
отцы, а есть ли способ сказать линкеру, чтобы он, если инлайнил бы какую-то функцию, то оставлял бы незаинлайненный вариант тоже
Igor
ни шланг ни гцц, даже HEAD, с -Wall -Wextra ничего не говорят, увы про анализаторы соглашусь
Vsevolod
а то у меня шланг выкидывает определенный символ (с lto), а потом ломается dlopen плагина, который на этот символ рассчитывает
Vsevolod
да, но это происходит во время линковки с lto
Vsevolod
я имею в виду выбрасывание ненужного по мнению линкера
Vsevolod
компилятор в single translation unit, конечно, должен оставлять обе версии, а вот линкер уже вместе с мусором выплескивает ребенка