Egor
выделяю память под функцию
Berkus
sizeof(void) распечатай в консоли
Egor
лол)
Egor
профиксил, но все-равно указатели одинаковые получаются
Egor
есть
Egor
https://blog.noctua-software.com/c-lambda.html
Egor
тело
Egor
Да
Egor
а что это тогда, если не си?
Nikita
а что это тогда, если не си?
Что угодно, но не С
Berkus
ba-dum-tss
Александр
constexpr function arguments, дискасс https://godbolt.org/g/KFkyCR
Александр
По-моему, это просто гениально
Matwey
Братья, я как-то неправильно использую boost.karma?
Matwey
In file included from /usr/include/boost/iostreams/detail/is_dereferenceable.hpp:13:0, from /usr/include/boost/iostreams/detail/resolve.hpp:26, from /usr/include/boost/iostreams/detail/push.hpp:24, from /usr/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp:31, from /usr/include/boost/iostreams/stream_buffer.hpp:22, from /usr/include/boost/iostreams/stream.hpp:21, from /usr/include/boost/spirit/home/karma/stream/detail/iterator_sink.hpp:13, from /usr/include/boost/spirit/home/karma/stream/stream.hpp:24, from /usr/include/boost/spirit/home/karma/stream.hpp:14, from /usr/include/boost/spirit/home/karma.hpp:27, from /usr/include/boost/spirit/include/karma.hpp:16, from /home/matwey/lab/libfailure/include/net/proto/legacy/line.h:6, from /home/matwey/lab/libfailure/test/bench/net/proto/legacy/line.cpp:1: /usr/include/boost/type_traits/detail/template_arity_spec.hpp:13:84: note: #pragma message: NOTE: Use of this header (template_arity_spec.hpp) is deprecated # pragma message("NOTE: Use of this header (template_arity_spec.hpp) is deprecated") Я не против того, что deprecated, я даже можно сказать за. Но как мне этот ворнинг убрать теперь?
Matwey
какой? karma.hpp?
Matwey
А какой вместо него?
Evgenii
хм ну тогда наверное буст патчить)
Matwey
Ну тут же целый чат экспертов
Matwey
Буду использовать более старый boost
Matwey
На зло чатику
Matwey
=D
Dr. Friedrich
Ты бы как-то поменьше пример сделал, а то кода очень уж дохрена. Кто его разберёт, в каком месте именно начинается расхождение.
Berkus
да там вроде минимальный пример )
Maksim
Я ещё раз проверил. Можно написать меньше по объёму, но непонятнее. Лучше от этого, как мне кажется, не станет.
Tom
По-моему, это просто гениально
Это классика. Непрактично уж очень: представь, сколько overloads надо написать, чтоб для каждого аргумента такое предусмотреть.
Constantine
Неужели никто не знает? Последний разочек поднимаю, уж очень надо.
Наваляйте тестов со static_assert, у меня бывали проблемы в вижаке 2015 U3 со странными случаями, когда decltype давал неожиданные результаты
Constantine
Вполне возможно, что какой-то трейт ломается
Maksim
Спасибо, попробую.
Constantine
Спасибо, попробую.
Какой вижак для начала
Maksim
2017
Maksim
(15.3.4)
Constantine
static_assert(std::is_same<has_ab_member_variables<Test>, void>::value, "AB failed"); //здесь еще ОК
Constantine
проблема при матче трейта ab_member_variables_has_the_same_type_policy
Constantine
при этом сам трейт вроде работает
Maksim
Как вы это выяснили?
Constantine
если его заменить на void, выводит yes
Constantine
при этом если написать ему значение int, переменная этого типа объявляется
Maksim
Бред какой-то.
Tom
Бред какой-то.
Проблема решена :)
Constantine
https://pastebin.com/pNm49REy
Constantine
чуть более короткий пример
Tom
Проблема решена :)
Замени два std::enable_if на один, и все будет работать
Constantine
Замени два std::enable_if на один, и все будет работать
Я привел пример, не работает на VS 2015
Constantine
Еще чуть более сокращенная версия
Constantine
https://pastebin.com/fKUGA7Sx
Tom
https://godbolt.org/g/hVn8Pr что тут не так?
Maksim
https://pastebin.com/nWNwbK1e
Maksim
Так тоже не работает.
Maksim
Хотя разницы особой нет.
Constantine
вообще есть какие-то фокусы с неиспользуемыми шаблонными параметрами, и я их не помню
Tom
Так тоже не работает.
Ты забыл _t у enable_if
Constantine
забавно, что вот так работает https://pastebin.com/PEXd8r8Y
Maksim
Ты забыл _t у enable_if
Точно! Спасибо! Так работает.
Constantine
Точно! Спасибо! Так работает.
короче, пишите через is_detected и будет вам счастье
Constantine
только 10 тестов на каждый трейт не забывайте
Tom
чуть более короткий пример
Короче, суть вот в чем. Когда enable_if_t появляется в using, то заканчивает работать SFINAE
Maksim
только 10 тестов на каждый трейт не забывайте
Спасибо за помощь. Я обязательно последую вашему совету.
Tom
Почему?
std::enable_if_t<false> есть ill-formed. Поэтому-то мы и используем его для matching. Но если вставить его в using, то получается мы пытаемся создать неверный typedef. Но можно например использовать std::enable_if, а type в самом конце ставить. Понятна идея?
Tom
Вот пример коротенький https://godbolt.org/g/1ADujW
Constantine
Вот пример коротенький https://godbolt.org/g/1ADujW
Собственно, в этом случае нет совершенно никакого SFINAE, хотя бы потому что нет S
Tom
почему тогда работает вот этот пример? using-выражение в нем есть void_t<enable_if_t<» с аналогичными свойствами https://pastebin.com/PEXd8r8Y
Какой-то извращенный пример... Полгода пройдет прежде, чем я пойму, что там происходит.
Tom
Вы знакомы с идиомой is_detected?
Конечно, только она не так записывается, а красивее
Constantine
Constantine
Собственно пример использует is_detected на выражение ab_member_variables_has_the_same_type_policy
Maksim
Кстати. Посоветуйте, пожалуйста, _современного_ чтива по всей этой шаблонной магии. Книги, блоги, что угодно.
Tom
почему тогда работает вот этот пример? using-выражение в нем есть void_t<enable_if_t<» с аналогичными свойствами https://pastebin.com/PEXd8r8Y
Потому что мы нигде std::enable_if_t<false> инстанциировать (или как это по русски) не пытаемся.