- 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; }
все решено.. перехожу писать код на "конецепты"
Именно поэтому я за js, ведь там можно не проверять Addable потому что и так можно сложить любую хуйню с любой хуйней
Реальные примеры:
https://govnokod.ru/26038#comment513100
Интересно...
Это же какой-то ёбаный стыд, что для простого сложения надо ставить пакет.
Функция в библиотеке находится для других целей - чтобы создать функциональную обертку над операторами
1)аргументы-данные находятся в функциях высшего порядка на последнем месте
2)функции все каррированы по дефолту
Покажи мне мейнстрим язык где это поддерживается из коробки
Не очень понял. Приведи пример
>2)функции все каррированы по дефолту
Зачем делать что-то по дефолту"?
Каррировние есть и в питоне (partial), да и в руби (Proc.curry)
Задача: найти сумму всех квадратов четных чисел
Условие: ты ебнутый функциональщиной петух
Underscore
Ramda:
Второй пример смотрится почище по-моему, за счет того, что:
1) функции каррированы, не надо ебать себе мозг partial на каждом вызове
2) место массива в map, filter и reduce - в конце списка аргументов во втором случае, благодаря чему не надо засирать код _ плейсхолдером, обозначая его место.
Пример полное говно, но надеюсь что по нему видно, насколько этидве особенности упрощают композицию функций
Эх, а я хотел подставить функцию 42 аргументов...
Вот в Ди все проще: iota(1,17).filter!"a%2==0".map!"a*a".fol d!"a+b"
После подстановки строковых параметров шаблонных функций получится
iota(1,17).filter!(a => a%2==0).map!(a => a*a).fold!((a,b) => a+b)
Все благодаря кодогенерации в компайл-тайме. Считай это работает как eval в пхп.
Но с проверкой синтаксиса и типов, оптимизацией и т.п.
А так даже можно 1.iota(10)
Да это просто математики до программирования дорвались. Если забыть о том, как композиция писалась в математике, то никто не мешает в compose функции в прямом порядке передавать.
Это твоя дряблая попка?
Или вообще:
Это же тот самый математический стиль, от которого пошла вся эта функциушня, но села на флешку абстракционной психозы, которая была призвана упростить жизнь, но в итоге стала решать вопросы факториалов, в которых такой инжиниринговый переголовень вовсе не нужен!
Например, 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; }
Разве в D компилятор сам не догадается проверить, есть ли у оператора + нужная перегрузка?
Интересно было бы почитать, как эта херня используется в реальных примерах.
без всяких шаблонов,
там под капотом не проверяется, что есть перегрузка + для операндов указанных типов? Или в D нет перегрузки операторов?
Если есть перегрузка операторов, то зачем тогда нужны шаблоны? Или оператор это чисто пример в этом случае, а с функциями перегрузка не прокатит?
А чтоб ты заебался готовиться к собеседованиям. В мире не так много людей, которые с первого раза правильно ответят на вопрос, "а что именно вызовется если у меня есть десяток обычных перегрузок и ещё пяток шаблонов".
> нельзя сделать без шаблонов
Ну потому что условие зачастую не для конкретных типов A, B и C, а для типов, у которых есть метод foo(). Обычные перегрузки так не могут.
,
когда T произволен и все возможные T вообще ничем не ограничены, в том числе абстрактным родителем?
А такой пример вообще скомпилируется? Или в крестах, как и в D, главное, чтобы он был синтаксически правильным, а семантика проверяется для конкретной подстановки?
А я ещё хотел узнать, а зачем в крестовых шаблонах можно указывать не только типы, но и значения? Это где-то реально используется?
Это чтобы можно было делать типы Matrix<4, 4>?
А Тарас вообще привёл хакерский пример:
https://govnokod.ru/14365
Ну это старые мсвц не могли. А все остальные работают в 2 фазы. И если ты не написал typename - значит это значение. Т.е. a<b,c>d по-умолчанию распарсится как операторы сравнений.
Если же нужно умножение, то надо явно писать (a*b)=c при наличии оператора *, возвращающего lvalue.
"Any ambiguities in the grammar between Statements and Declarations are resolved by the declarations taking precedence."
- это что ещё за покемон? А, главное, зачем так писать?
char * s
count * size
const int a = 42;
int b = 0;
const int c = 100500;
a * b = c;
solve( 3*a+5*b=c, 7*b-8*d=5*c)
Вот вам и специальная олимпиада по написанию такой штуки.
ААААААА
https://github.com/adamdruppe/arsd/blob/master/dom.d
Значит, у других всё же синтаксическая проверка осуществляется.
А чтобы не скучать, есть еще параметры по умолчанию
Я так понимаю, на этот вопрос нужно ответить, но не стоит отвечать правильно?
А. "А хрен его знает?" - кандидат не знает C++, нам такой не нужен.
Б. "Сначала то, а потом то, при условии таком-то, ссылка на параграф стандарта такой-то" - кандидат поехавший, он нам либо весь код в неподдерживаемую, но корректную с точки зрения стандарта питушню переведёт, либо как-то раз память его подведёт, и он самонадеянно допустит UB, пока коллеги пишут "(a == b) || (c == d)" вместо "a == b || c == d", нам такой вообще ни за что никогда не нужен (кандидата А ещё можно научить, а этот петух Б нам все проекты на дно утянет).
В. "А хрен его знает, но там есть свой установленный стандартом порядок, искать нужно там-то, ключевые слова для поиска такие" - вот это нормальный кандидат, этого берём.