@ProCxx

Страница 2279 из 2477
Andrey
14.08.2018
11:56:23
я за (2)
но зачем?

Евгений
14.08.2018
11:57:00
шобы нинаследоваться

Andrey
14.08.2018
12:00:26
шобы нинаследоваться
поясните, пожалуйста

Google
Евгений
14.08.2018
12:01:39
Вместо наследования для расширения функциональности просто определяем метод, и вот мы расширили класс

Andrey
14.08.2018
12:21:48
Ilia
14.08.2018
12:24:19
поясните, пожалуйста
Чтобы обобщенное функциональное программирование можно было поддерживать.

Roman
14.08.2018
12:26:30
про 2) типичный пример с итераторами : x.begin vs begin(x)

Andrey
14.08.2018
12:27:02
Без этого нельзя делать apply на методы
struct X { void f(int); }; void test(X x, int y) { std::apply(&X::f, std::tuple(std::ref(x), y)); }

за счет того, что std::apply вызывает внутри себя std::invoke все прекрасно работает

Ilia
14.08.2018
12:27:53
std::invoke решает эту проблему
Но идея проползла Страустрап была и в том, что member functions и free functions выходят на один уровень друг с другом, с только той разницей, что у member первый параметр обязательный и this.

Google
Roman
14.08.2018
12:32:27
Хороший вопрос нужны ли extension методы для встроенных типов..

Andrey
14.08.2018
12:32:54
про 2) типичный пример с итераторами : x.begin vs begin(x)
тоже решенная проблема — всегда вызывать свободную функцию

Roman
14.08.2018
12:33:13
5.times([]{ cout « "hello\n"; })

Соломончик
14.08.2018
12:34:00
Ребят, оффтоп Кто-то знает как посмотреть размер стека? Может есть какая-то функция для этого?

В вижуалке

Roman
14.08.2018
12:34:27
можно сразу добавить синтаксический сахар как в kotlin , чтобы если последний параметр std::function, то можно сразу писать тело лямды 5.times { cout << "hi"; }

Stanislav
14.08.2018
12:34:42
5.times([]{ cout « "hello\n"; })
руби какой то :D

Andrey
14.08.2018
12:42:05
5.times([]{ cout « "hello\n"; })
Пользуйтей уже сейчас: struct Invoker { const size_t count; template<typename F> void operator() (F f) { for (int i = 0; i != count; ++i) f(); } }; Invoker operator "" _times(long double x) { return { static_cast<size_t>(x) }; } void test() { using std::cout; 5._times([]{ cout << "hello\n"; }); }

Юра Незнанов
14.08.2018
12:43:37
что будет если в заголовке екзешника указана неправильная контрольная сумма?

он запустится?

Igor
14.08.2018
12:44:11
Invoker operator "" _times(long double x) { return { static_cast<size_t>(x) }; } что уже и такое можно?
пользовательский литерал из вещественного числа, появились в с++11

Andrey
14.08.2018
12:45:44
пользовательский литерал из вещественного числа, появились в с++11
без вещественного числа будет только лучше, просто в исходном коде было 5. вот я и написал так

Дед Пегас
14.08.2018
12:45:52
Google
Дед Пегас
14.08.2018
12:49:51
Только без рекламы, пожалуйста.

Andrey
14.08.2018
12:59:45
почему лучше? 5_times не читаемо же?
что читаемо, а что нет вопрос довольно субъективный, но мне бы не хотелось, чтобы 3.1415926e+10_times([]{ cout << "hello\n"; }) компилировлось

Roman
14.08.2018
13:00:23
ну наверное

Дед Пегас
14.08.2018
13:34:11
Дед Пегас
14.08.2018
13:35:59
Вот кстати, 2_times.call([]{ cout << "1\n"; }); не выйдет, придётся таки завернуть в скобки.

Constantine
14.08.2018
13:36:04
https://wandbox.org/permlink/EShciwiFQFBs47lQ
Давай std::size_t для индексов, все-таки

Дед Пегас
14.08.2018
13:36:20
Constantine
14.08.2018
13:36:30
Дед Пегас
14.08.2018
13:36:38
Коньцепт

Constantine
14.08.2018
13:38:26
Коньцепт
Слышь, а когда разрешили auto параметры функции?

Дед Пегас
14.08.2018
13:38:38
Constantine
14.08.2018
13:38:59
Я уже судорожно пошел перелопачивать cppref

Дед Пегас
14.08.2018
13:39:11
Просто gcc кидает только ворнинг, а шланг ошибку.

Egor
14.08.2018
13:39:11
только возвращаемое значение

Constantine
14.08.2018
13:40:01
Просто gcc кидает только ворнинг, а шланг ошибку.
Угу, это же имеет понятно какой смысл, просто почему-то синтаксис не сделали

Stanislav
14.08.2018
13:49:14
ну в гцц концепты давненько

Google
Oleg
14.08.2018
13:59:05
плюсач

можно ли замутить такую штуку: template <T, U> class A: public T { U GetVar() { T::GetVar(); } } class B { int GetVar(); } A<B, int> *a = new A<B, int>()

Alexander
14.08.2018
14:11:16
ну в гцц концепты давненько
кстати, концепты в шланге feature-complete

Alexander
14.08.2018
14:12:45
в 7ке ?
в форке

https://github.com/saarraz/clang-concepts

Andrey
14.08.2018
14:50:04
Вот кстати, 2_times.call([]{ cout << "1\n"; }); не выйдет, придётся таки завернуть в скобки.
так не надо .call вызывать, так работает: #include <iostream> struct Invoker { const unsigned long long count; template<typename F> void operator() (F f) { for (int i = 0; i != count; ++i) f(); } }; Invoker operator "" _times(unsigned long long x) { return { x }; } void test() { using std::cout; 2_times([]{ cout << "hello\n"; }); }

Andrey
14.08.2018
15:33:12
Андрей, зачем вы пишете через этот using? Вы понимаете, зачем вообще так пишут?
потому что topic starter хотел иметь возможность писать `5.times([]{ cout « "hello\n"; })`

Ignat
14.08.2018
15:33:33
за таким в скалку

Constantine
14.08.2018
15:33:44
потому что topic starter хотел иметь возможность писать `5.times([]{ cout « "hello\n"; })`
using name; операция с name это вообще-то очень специфическая конструкция языка

Дед Пегас
14.08.2018
15:34:07
Отличная же.

Constantine
14.08.2018
15:34:25
Отличная же.
Отличная, но у неё специальное назначение

Дед Пегас
14.08.2018
15:34:34
Ну уж прямо.

Andrey
14.08.2018
15:34:54
using name; операция с name это вообще-то очень специфическая конструкция языка
в данном случае я не вкладывал в нее сакрального смысла

Constantine
14.08.2018
15:34:55
Ну уж прямо.
Хм.. ну вот глубокое ИМХО это целенаправленное подключение ADL по name

Т.е. цель замена name lookup с qualified на unqualified

Google
Constantine
14.08.2018
15:36:34
в данном случае я не вкладывал в нее сакрального смысла
такое встречается при вызове из шаблонов расширяемо-перегруженных функций, например //std::sort using std::swap; swap(a, b);

т.е. это указание, что за using идет extension point

Andrey
14.08.2018
15:37:23
такое встречается при вызове из шаблонов расширяемо-перегруженных функций, например //std::sort using std::swap; swap(a, b);
Я знаю, слава богу в С++20 благодаря http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html эта муть должна сгинуть.

Constantine
14.08.2018
15:39:19
Я знаю, слава богу в С++20 благодаря http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html эта муть должна сгинуть.
Я не хочу изучать предложение, но мне кажется, что там есть очень сильно скрытые ошибки В частности, емнип customization point можно закрыть функтором, которым сам будет perfect forward-ить параметры и скрывать using, но это обладает кучей минусов

Т.е. в действительности там почти что неустранимые проблемы

Constantine
14.08.2018
15:40:49
да речь идет именно об этой идее
а там есть аргументация, что параметры всегда можно perfect forward-ить?

я как минимум вспомню две именованные сущности в C++, которые просто не имеют типа

это { bracket-init } и overloaded_function

и обе эти сущности не могут пройти через perfect forwarding

т.к. их интерепретация попросту зависит от целевого типа и он не может быть auto

какие именно?
скажем так, я немного размышлял и у меня получался, что без специального декларатора невозможно решить все проблемы customization point

где декларатор должен изменять правила name lookup для этого имени

Andrey
14.08.2018
15:46:07
и обе эти сущности не могут пройти через perfect forwarding
эти сущности и не могут быть переданы в такие customization points как std::{begin, swap, hash, ...}

Andrey
14.08.2018
15:51:15
мне кажется, это неверно
а пример приведете?

Страница 2279 из 2477