
Tengiz
16.08.2017
16:48:53
Привет! Вопрос про type trait для generic lambda (lambda с auto)
Можно ли сделать type trait чтобы отличить generic lambda с разным количество параметров?
Например, мне хотелось бы уметь отличать
auto f1 = [&]{ \* code *\ };
от
auto f2 = [&](const auto& arg){ \* code \* };
и от
auto f3 = [&](bool flag, const auto& arg){ \* code \* };
Для обычных lambda это можно делать например с помощью std::result_of или с помощью declval

Vladislav
16.08.2017
16:51:22

Tengiz
16.08.2017
16:52:09
Обычную лямбду я имею ввиду
[](int arg){};
, т.е. там где тип уже есть.

Google

Vladislav
16.08.2017
16:53:26
я понимаю, но как с помощью result_of понять количество аргументов, не зная конкретные типы?

Tengiz
16.08.2017
16:54:06
как-нибудь так -
template<typename T, typename R = typename std::result_of<T(bool)>::type>
где T это лямда
а количество наверное никак

Evgeniy
16.08.2017
16:55:56

Aidar
16.08.2017
16:56:11

Vladislav
16.08.2017
16:56:39

Tengiz
16.08.2017
16:57:33
Собственно количество параметров узнать не так важно. Хотелось бы уметь отличать f1 от f2 и от f3

Evgeniy
16.08.2017
16:58:44

Google

Antony
16.08.2017
16:59:26
Вот так попробуйте https://github.com/boostorg/callable_traits
документация вот тут http://boostorg.github.io/callable_traits/doc/html/index.html
* сам не смотрел, но подозреваю что умеет

Vladislav
16.08.2017
17:00:14

Evgeniy
16.08.2017
17:00:42

Vladislav
16.08.2017
17:00:50
да

Tengiz
16.08.2017
17:00:58

Aidar
16.08.2017
17:01:05
лол

Alexander
16.08.2017
17:01:09

Vladislav
16.08.2017
17:01:39

Tengiz
16.08.2017
17:01:58
Библиотека любопытная, но большенство необходимых type traits не поддерживают generic lambda

Constantine
16.08.2017
17:09:25
Хм... наверное можно сделать тип, который вообще ни к чему не приводится, и если в лямбду подставилось - точно шаблонный

Vladislav
16.08.2017
17:10:12

Aidar
16.08.2017
17:10:18

Constantine
16.08.2017
17:10:24
Типа enable_if обойдет?

Aidar
16.08.2017
17:10:27
тебе кажись хватит

Tengiz
16.08.2017
17:11:17

Aidar
16.08.2017
17:11:35
можно было обойтись decltype от вызова

Google

Constantine
16.08.2017
17:11:46
да не работает
[](auto argument) -> decltype(argument::return_type)

Vladislav
16.08.2017
17:12:02
но оно и так через result_of легко делается, по идее

Tengiz
16.08.2017
17:12:43
Увы, в проекте нет C++17

Aidar
16.08.2017
17:15:58
Увы, в проекте нет C++17
template <typename Func>
auto test(Func f) -> decltype(f(std::declval<bool>())) {
return f(true);
}
int main() {
auto asdasd = [](auto aa) { return aa; };
test(asdasd);
}

Tengiz
16.08.2017
17:16:43

Evgeniy
16.08.2017
17:17:37
A Type Sanitizer (LLVM) https://reviews.llvm.org/D32198

Tom
16.08.2017
17:24:05
Ок, спасибо буду пробовать
https://godbolt.org/g/wxaEk3
Штука есть такая — detection idiom. С помощью нее удобно такие вещи писать.

Ioann V
16.08.2017
17:25:13
Ребята, беда такая: есть QTreeWidget, и туда ставлю свои виджеты, наследованные от QWidget. Далее, рисую в вьпорте QTreeWidget, все рисуется, но вот рисуется именно что в дереве виджетов, а на кастомных виджета - нет ! То есть рисунок находится ЗА НИМИ ! Как его вывести вперед ?

Admin
ERROR: S client not available

Aleksandr
16.08.2017
17:26:26
тебе нужно вручную отрисовать сначало элементы а потом поверх рисунок

Aleksandr
16.08.2017
17:27:04
например в нашей любимой телеге так перерисовываю список контактов при наведении (ну несовсем так но смысл тот же)

Ioann V
16.08.2017
17:30:58
Блин, а по другому никак ? Ну, даже так, а как перерисовать вот эти вот кнопочки раньше чем ... ? Их отрисовкой не я маюсь, а виджет, видимо
То есть я вызвал некий метод класса КуТриВиджет, который эти виджеты туда установил, вот и все... Дальше оно там как то само рисуется, и как этим управлять ???!
Можно конечно всякие ехал сигнал через сигнал видит сигнал и руку в сигнал написать, но черт побери я когда со своего движка уходил смотрел в сторону кути именно по причине того, что там много всего и все легко делается, но пока что не так... Да и ограничений много(в т.ч на вложенные классы)

Anatoly
16.08.2017
17:54:43
Кури делегаты Qt

Ioann V
16.08.2017
18:00:12

Anton
16.08.2017
18:31:29
Кто чем занимается?)
Кто чем занимается?)

Google

Alex Фэils?︙
16.08.2017
18:32:16
/rules


Group Butler [beta]
16.08.2017
18:32:17
/rules
Правила
0. Язык чата — русский. The chat's language is Russian.
1. Простые вопросы (к примеру, о базовом синтаксисе языка, или от новичков в C/C++) , лабы, "помогите с задачкой" и о IDE — в чат новичков: https://telegram.me/joinchat/BYlFbD3eN3JMaG34hyh96w
2. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств (для этого есть pro.cxx.holywars — https://telegram.me/joinchat/BYlFbECi8UKU0bCqc7jWlQ и @flood);
2.0. Не поддавайтесь на провокации, а лучше репортите, написав в реплае @admin.
2.1. Не делайте ложных доносов на людей, и не "пингуйте" администраторов чата зря;
2.2. Не разводите срачи/холивары в этом чате. За разведение срача администрация банит без предупреждения;
3. Не надо оффтопить в этом чате и флудить (в частности не рекомендуется писать кучу мелких сообщений);
3.0. Не стоит злоупотреблять стикерами и (или) кидать их без всякой причины;
3.1. Голосовые сообщения в этом чате запрещены;
4. Вы можете спросить тематический чат, и вам, по возможности, его подскажут (также можно ввести команду #chatlist, и бот вам напишет списочек известных чатов)
5. Все вакансии, реклама и добавление своего чатика в списочек известных чатов — по согласованию с @AlexFails;
6. Нарушители сначала получают предупреждение, а затем, в случае рецидива, бан на срок от 1 дня до бесконечности.
Все правила - /rules.


Vladislav
16.08.2017
18:35:51

Group Butler [beta]
16.08.2017
18:35:51
Anton has been warned (2/5)

Vladislav
16.08.2017
18:35:56
не надо флудить

Grigor
16.08.2017
18:36:52
кстати, а батлер умеет отправлять в RO?

Alex Фэils?︙
16.08.2017
18:37:12
да, но там мало опций пока что

Grigor
16.08.2017
18:37:42
просто мб явный шлак перманентом банить, а других на время в RO, образумиться

Владислав
17.08.2017
08:45:53
Ребят, тупенький вопрос, на как правильно работать с таким кейсом? Есть некий дабл, есть некий процент, нужно взять процент от дабла и округлить полученное значение. Например double = 10.0, процент = 65%, берём 65% от 10, ожидаем получить 6.5, но на практике получаем 6.4999999, из-за чего округление неправильно работает, как в общем случае такие ситуации обрабатывать?

Dmitry
17.08.2017
08:49:14
Это не ошибка округления, а принципиальная проблема представления десятичных чисел в бинарной форме. Если ты знаешь, что тебе достаточно одного знака после запятой, то можешь просто печатать с точностью до одного знака — тогда произойдёт округление. Нужно знать больше о контексте твоей задаче, чтобы предложить более оптимальное решение.

Antony
17.08.2017
08:49:51
https://habrahabr.ru/post/112953/

Dmitry
17.08.2017
08:50:29
??

Eugene
17.08.2017
08:52:51
С decimal там ничего не планируется в стандарте?

Владислав
17.08.2017
08:53:56