- 1
- 2
- 3
- 4
- 5
template<typename T>
concept Addable = requires (T x) { x + x; }; // requires-expression
template<typename T> requires Addable<T> // requires-clause, not requires-expression
T add(T a, T b) { return a + b; }
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+3
template<typename T>
concept Addable = requires (T x) { x + x; }; // requires-expression
template<typename T> requires Addable<T> // requires-clause, not requires-expression
T add(T a, T b) { return a + b; }
все решено.. перехожу писать код на "конецепты"
ASD_77 05.05.2020 20:58 # 0
bootcamp_dropout 06.05.2020 10:54 # 0
Именно поэтому я за js, ведь там можно не проверять Addable потому что и так можно сложить любую хуйню с любой хуйней
nemyx 06.05.2020 11:02 # 0
Реальные примеры:
MAKAKA 06.05.2020 11:12 # 0
nemyx 06.05.2020 11:15 # 0
guest8 06.05.2020 11:20 # −999
nemyx 06.05.2020 13:56 # 0
bormand 06.05.2020 13:57 # +1
guest8 06.05.2020 14:07 # −999
Web_Monkey 08.05.2020 10:05 # +1
Stallman 08.05.2020 11:20 # +1
nemyx 08.05.2020 11:31 # +1
https://govnokod.ru/26038#comment513100
bootcamp_dropout 06.05.2020 11:42 # 0
nemyx 06.05.2020 11:48 # 0
Интересно...
bootcamp_dropout 06.05.2020 11:58 # 0
nemyx 06.05.2020 12:01 # 0
bootcamp_dropout 06.05.2020 12:04 # 0
guest8 06.05.2020 12:08 # −999
bootcamp_dropout 06.05.2020 12:14 # 0
MAKAKA 06.05.2020 12:19 # +1
Это же какой-то ёбаный стыд, что для простого сложения надо ставить пакет.
bootcamp_dropout 06.05.2020 12:25 # −1
Функция в библиотеке находится для других целей - чтобы создать функциональную обертку над операторами
MAKAKA 06.05.2020 12:32 # 0
bootcamp_dropout 06.05.2020 12:37 # 0
1)аргументы-данные находятся в функциях высшего порядка на последнем месте
2)функции все каррированы по дефолту
Покажи мне мейнстрим язык где это поддерживается из коробки
MAKAKA 06.05.2020 12:45 # 0
Не очень понял. Приведи пример
>2)функции все каррированы по дефолту
Зачем делать что-то по дефолту"?
Каррировние есть и в питоне (partial), да и в руби (Proc.curry)
bootcamp_dropout 06.05.2020 13:07 # +1
Задача: найти сумму всех квадратов четных чисел
Условие: ты ебнутый функциональщиной петух
Underscore
Ramda:
Второй пример смотрится почище по-моему, за счет того, что:
1) функции каррированы, не надо ебать себе мозг partial на каждом вызове
2) место массива в map, filter и reduce - в конце списка аргументов во втором случае, благодаря чему не надо засирать код _ плейсхолдером, обозначая его место.
Пример полное говно, но надеюсь что по нему видно, насколько этидве особенности упрощают композицию функций
nemyx 06.05.2020 13:38 # 0
Эх, а я хотел подставить функцию 42 аргументов...
nemyx 06.05.2020 13:47 # 0
jojaxon 06.05.2020 13:54 # +2
Вот в Ди все проще: iota(1,17).filter!"a%2==0".map!"a*a".fol d!"a+b"
nemyx 06.05.2020 13:58 # +2
jojaxon 06.05.2020 14:01 # +2
После подстановки строковых параметров шаблонных функций получится
iota(1,17).filter!(a => a%2==0).map!(a => a*a).fold!((a,b) => a+b)
Все благодаря кодогенерации в компайл-тайме. Считай это работает как eval в пхп.
bormand 06.05.2020 14:06 # 0
Но с проверкой синтаксиса и типов, оптимизацией и т.п.
jojaxon 06.05.2020 14:12 # +1
А так даже можно 1.iota(10)
bormand 06.05.2020 14:18 # 0
Да это просто математики до программирования дорвались. Если забыть о том, как композиция писалась в математике, то никто не мешает в compose функции в прямом порядке передавать.
Needless 06.05.2020 18:51 # +2
jojaxon 06.05.2020 18:59 # 0
Needless 06.05.2020 19:12 # +1
Это твоя дряблая попка?
OCETuHCKuu_nemyx 06.05.2020 19:50 # 0
1024-- 06.05.2020 20:08 # 0
gost 06.05.2020 20:46 # +2
Или вообще:
guest8 06.05.2020 21:06 # −999
gost 06.05.2020 21:27 # 0
guest8 06.05.2020 21:37 # −999
gost 06.05.2020 21:55 # 0
1024-- 06.05.2020 22:47 # 0
Это же тот самый математический стиль, от которого пошла вся эта функциушня, но села на флешку абстракционной психозы, которая была призвана упростить жизнь, но в итоге стала решать вопросы факториалов, в которых такой инжиниринговый переголовень вовсе не нужен!
jojaxon 08.05.2020 02:12 # 0
gost 08.05.2020 05:32 # +1
TOPT 08.05.2020 06:01 # 0
jojaxon 06.05.2020 14:37 # +1
Например, constexpr. В Ди почти все функции доступны в компайл-тайме.
Или вот эта хрень с нечитаемыми концептами с мутным синтаксисом. То ли дело в Ди:
bool isAddable(T)() { T a; return __traits(compiles, a+a); } //просто шаблонная функция
bool isConcatinable(T)() { T a,b; return __traits(compiles, a~b); }
T add(T)(T a, T b) if(isAddable!T) { return a+b; } //без извратов проверяем подходит ли тип
T add(T)(T a, T b) if(isConcatinable!T) { return a~b; }
Desktop 06.05.2020 14:49 # 0
Разве в D компилятор сам не догадается проверить, есть ли у оператора + нужная перегрузка?
Интересно было бы почитать, как эта херня используется в реальных примерах.
jojaxon 06.05.2020 15:03 # 0
Desktop 06.05.2020 15:11 # 0
без всяких шаблонов,
там под капотом не проверяется, что есть перегрузка + для операндов указанных типов? Или в D нет перегрузки операторов?
jojaxon 06.05.2020 15:15 # 0
bormand 06.05.2020 15:21 # 0
Desktop 06.05.2020 15:32 # 0
jojaxon 06.05.2020 15:39 # 0
Desktop 06.05.2020 15:53 # 0
Если есть перегрузка операторов, то зачем тогда нужны шаблоны? Или оператор это чисто пример в этом случае, а с функциями перегрузка не прокатит?
bormand 06.05.2020 16:19 # +1
А чтоб ты заебался готовиться к собеседованиям. В мире не так много людей, которые с первого раза правильно ответят на вопрос, "а что именно вызовется если у меня есть десяток обычных перегрузок и ещё пяток шаблонов".
> нельзя сделать без шаблонов
Ну потому что условие зачастую не для конкретных типов A, B и C, а для типов, у которых есть метод foo(). Обычные перегрузки так не могут.
Desktop 06.05.2020 16:26 # 0
,
когда T произволен и все возможные T вообще ничем не ограничены, в том числе абстрактным родителем?
А такой пример вообще скомпилируется? Или в крестах, как и в D, главное, чтобы он был синтаксически правильным, а семантика проверяется для конкретной подстановки?
jojaxon 06.05.2020 16:42 # 0
Desktop 06.05.2020 16:47 # 0
А я ещё хотел узнать, а зачем в крестовых шаблонах можно указывать не только типы, но и значения? Это где-то реально используется?
Это чтобы можно было делать типы Matrix<4, 4>?
bormand 06.05.2020 16:51 # +1
nemyx 06.05.2020 16:58 # 0
bormand 06.05.2020 16:59 # 0
bormand 06.05.2020 16:46 # +2
nemyx 06.05.2020 17:30 # 0
А Тарас вообще привёл хакерский пример:
https://govnokod.ru/14365
Desktop 06.05.2020 17:37 # +1
nemyx 06.05.2020 17:41 # 0
bormand 06.05.2020 18:00 # +1
Ну это старые мсвц не могли. А все остальные работают в 2 фазы. И если ты не написал typename - значит это значение. Т.е. a<b,c>d по-умолчанию распарсится как операторы сравнений.
jojaxon 06.05.2020 18:18 # +2
bormand 06.05.2020 18:19 # 0
jojaxon 06.05.2020 18:27 # 0
Если же нужно умножение, то надо явно писать (a*b)=c при наличии оператора *, возвращающего lvalue.
"Any ambiguities in the grammar between Statements and Declarations are resolved by the declarations taking precedence."
Needless 06.05.2020 18:46 # 0
Desktop 06.05.2020 18:31 # 0
- это что ещё за покемон? А, главное, зачем так писать?
Needless 06.05.2020 18:40 # +1
char * s
count * size
Needless 06.05.2020 18:46 # 0
1024-- 06.05.2020 20:09 # +1
bormand 06.05.2020 18:48 # 0
const int a = 42;
int b = 0;
const int c = 100500;
a * b = c;
guest8 06.05.2020 18:49 # −999
jojaxon 06.05.2020 18:51 # +2
solve( 3*a+5*b=c, 7*b-8*d=5*c)
Вот вам и специальная олимпиада по написанию такой штуки.
jojaxon 06.05.2020 17:43 # +3
Desktop 06.05.2020 17:59 # 0
ААААААА
https://github.com/adamdruppe/arsd/blob/master/dom.d
Needless 06.05.2020 18:42 # +2
jojaxon 06.05.2020 18:47 # 0
Desktop 06.05.2020 17:43 # +1
Значит, у других всё же синтаксическая проверка осуществляется.
jojaxon 06.05.2020 17:45 # +1
MAKAKA 06.05.2020 17:00 # +2
А чтобы не скучать, есть еще параметры по умолчанию
bormand 06.05.2020 17:01 # +1
jojaxon 06.05.2020 17:03 # 0
bormand 06.05.2020 17:14 # +1
MAKAKA 06.05.2020 17:07 # 0
1024-- 06.05.2020 20:17 # +3
Я так понимаю, на этот вопрос нужно ответить, но не стоит отвечать правильно?
А. "А хрен его знает?" - кандидат не знает C++, нам такой не нужен.
Б. "Сначала то, а потом то, при условии таком-то, ссылка на параграф стандарта такой-то" - кандидат поехавший, он нам либо весь код в неподдерживаемую, но корректную с точки зрения стандарта питушню переведёт, либо как-то раз память его подведёт, и он самонадеянно допустит UB, пока коллеги пишут "(a == b) || (c == d)" вместо "a == b || c == d", нам такой вообще ни за что никогда не нужен (кандидата А ещё можно научить, а этот петух Б нам все проекты на дно утянет).
В. "А хрен его знает, но там есть свой установленный стандартом порядок, искать нужно там-то, ключевые слова для поиска такие" - вот это нормальный кандидат, этого берём.