Arseny
я про ссылку на SO. там std::function<void()> и std::function<void(int)>
Note that there's been a slight change to the wording above, due to LWG 2420: There's an exception that if the return type R of a std::function<R(ArgTypes...)> is void, then any return type is accepted (and discarded) for the Callable in the constructor template mentioned above. For example, both []() -> void {} and []() -> bool {} are Callable for std::function<void()>
Surreal
я про ссылку на SO. там std::function<void()> и std::function<void(int)>
А, это да. Но там в комменте и про возвращаемый есть: void foo(std::function<void()>); void foo(std::function<bool()>); foo([]() -> bool {}); // ambiguous
Roman
хммм, я немного растерян этим немалым потоком инфы, в данном случае я пытаюсь упростить интерфейс библиотеки чтоб не приходилось писать: ->attach([]( const StreamHandle& handle, const QVariant& data, ) { Q_UNUSED(stream) Q_UNUSED(data) // ... return nullptr; }) а можно бы было просто: ->attach([]() { // ... })
Roman
это вообще, в таком случае, возможно?
Arseny
Не возвращайте void Возвращайте, допустим, struct Unit{};
Surreal
Anatoly
да можно оставить и Reference и возвращать nullptr
Anatoly
без перегрузки attach
Arseny
А если возвращать struct Unit : {int a[0];}?
Важно, чтобы Stream::attach(std::function<Unit()> function); а не Stream::attach(std::function<void()> function);
Anatoly
в сущности перегрузка с void это всего лишь сахар
Surreal
Важно, чтобы Stream::attach(std::function<Unit()> function); а не Stream::attach(std::function<void()> function);
Надо потестить, будет ли оно нормально работать. У меня как-то были траблы с зеросайзед объектами.
Anatoly
в любом случае, результат выполнения функция не учавствует в процессе разрешения перегрузки
Anatoly
int boo() {return 0;} void boo() {}
Anatoly
не скомпилируется
Anatoly
отсюда и std::function ведет себя подобным образом
Roman
короче нельзя перегрузить attach разными типами ламбды
Roman
придётся тогда nullptr возвращать по старинке
Anatoly
можно, если будут разные сигнатуры
Roman
можно, если будут разные сигнатуры
не совсем понял, поясни пожалуйста
Anatoly
ну, если они будут отличатся числом или типом параметров
Arseny
отсюда и std::function ведет себя подобным образом
Но std::function при конвертации учитывает возвращаемое значение. Спецэффект именно с void.
Roman
Но std::function при конвертации учитывает возвращаемое значение. Спецэффект именно с void.
короче нельзя из ламбды void возвращать, правильно я понял?
Anatoly
можно
Roman
можно
ну так иначе же хрень будет с resolving'ом?
Arseny
std::function<void(void)> x = []{return std::string();}; компилируется. В этом проблема
Anatoly
можно, если нет перегрузки с таким же типом и числом аргументов, но отличающейся типом результата
Berkus
а в чем здесь проблема?
в том что стринг ты не получишь
Danil
лол, очевидно же
Anatoly
std::function<void(void)> x = []{return std::string();}; компилируется. В этом проблема
2 A callable object f of type F is Callable for argument types ArgTypes and return type R if the expression INVOKE (f, declval<ArgTypes😠)..., R), considered as an unevaluated operand (Clause 5), is well formed (20.9.2).
Anonymous
хай. соре за нубский вопрос. Скажите, плз, какую версию С++ желательно учить? по какой больше материала? начал учить питон, такое чувство что превращаешься в зомби-кодера, без понимания что как работает
Anatoly
Тьфу. То есть на http://cplusplus.github.io/LWG/lwg-defects.html#2420
почему же? просто не знал, спасибо!
Anonymous
лан.
Matway
Сижу, переписываю красивый код с std::variant обратно на switch. std::variant не просто тормозит, а ужасно тормозит. В ассемблере полная каша. На MSVC variant замедляет мой код на 70%, на Clang - 30%.
Matway
Разумеется, -O3
Matway
Вот так вот программист не должен платить за абстракции, ага.
Anatoly
а код не под управлением чего-то гитоподобного?
Anatoly
откатится нельзя?
Matway
Гит, да. Куда откатиться?
Anatoly
или ты с нуля написал и теперь отказался, сорри не понял
Matway
Мы месяца четыре назад с радостным улюлюканьем перебежали на std::variant. А вот сегодня я засел профайлить.
Anatoly
а профилировщик на что показывает? какие места проседают? я бы попробовал, если у тебя есть синтетический тест
Matway
Собственно, во внутренности variant и показывает.
Matway
В моём понимании, эта штука должна полностью уйти в процессе оптимизации. Ан нет. Попытался почитать ассемблер - там кошмар.
Matway
А он у тебя прямо в critical path используется?
Остальной код писан осторожно, каждый лишний if на счету. Вот на фоне кода, который писался с производительностью в уме, variant и "заиграл". В обычном коде думаю не было бы так критично.
Matway
Ну то есть буквально - со switch наш компилятор компилирует большой проект 30 секунд, а с variant - 51 секунду.
Matway
А в гцц?
Нет под рукой, к сожалению. Мы используем только MSVC и Clang. Будет время - попробую.
Matway
Что интересно, с variant MSVC и Clang собирают одинаковый по производительности код.
Matway
Но со switch MSVC ускоряется гораздо сильнее, чем Clang.
Matway
кланг который майкрософтский же, да?
Не только. Под другие платформы обычный Шланг. Та же картина.
Matway
В ассебмлере вообще не вижу выборки из switch-таблицы. Похоже, variant компилируется в серию бранчей. Это грустно.
Stanislav
возможно ли написать вариант который работал бы аналогично быстро?
Matway
возможно ли написать вариант который работал бы аналогично быстро?
Вероятно, было бы возможно, если бы можно было case генерить вариадиками. Пока что нельзя.
Vladislav
23
А чем свитч заменяется? visit(overloaded())?
Matway
Да.
Matway
overload я писал руками, но там вроде нечему портить картину. На всякий случай перепроверил на собранной ручками структуре - те же дела.
Berkus
кланг который майкрософтский же, да?
а у майкрософта уже свой шланг внезапно?
Matway
Официально - Clang with Microsoft CodeGen
Matway
Майкрософт прикинулся Шлангом...
Vladislav
Clang/C2. Очень крутая вещь.
Сишечка без заголовков, круто
Anatoly
только 32 битный?
Matway
только 32 битный?
Нет, x64 вполне собирает и работает. Там идея простая - берётся слегка модифицированный Шланг, генерирует LLVM IR. А потом с этим работает Microsoft CodeGen - LLVM Backend от Майкрософта.
Vladislav
http://c2lang.org/site/introduction/languages.svg
Vladislav
http://c2lang.org/site/introduction/languages.svg
Да они офигели ставить go по уровню абстракции выше плюсов и D (и раста)