
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (56) « Первая ... 15 16 [17] 18 19 ... 55 56 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#241
,
|
|
Затем:
![]() ![]() template<typename A, typename B> auto hellSum(A a, B b) -> decltype(a + b); |
Сообщ.
#242
,
|
|
|
![]() ![]() #include <iostream> using namespace std; class C { }; class D: public C { }; class B { }; class A { bool var; public: A(bool var) : var(var) {} C operator*(const B& b) { return C(); } D operator+(const B& b) { return D(); } bool get_var() { return var; } }; template<typename A, typename B> auto hellArithmetics(A a, B b) -> decltype(a * b) { /* auto - C or D */ if(a.get_var()) { return a * b; } return a + b; } int main() { A a1(true); A a2(false); B b; C c1 = hellArithmetics(a1, b); C c2 = hellArithmetics(a2, b); return 0; } |
Сообщ.
#243
,
|
|
|
Цитата Qraizer @ Все прекрасно. Информация дается в комментариях, а не в безумном decltype, который, кстати, может содержать трехэтажные конструкции. Эту работу, ИМХО, может и должен делать компилятор. Особенно есди учесть, что интерфейсы шаблонов функций без тела этих функций полезны в C++ чуть более, чем никогда. Очень информативно увидеть в интерфейсе просто auto без информации о реализации. Добавлено Мяут-Настоящий, что это? Типа пример зачем нужен decltype? Он не нужен: http://dpaste.dzfl.pl/4333f7a197f7 ![]() ![]() class C { }; class D: C { }; class B { }; class A { bool m_var; this(bool var) { m_var = var; } C opBinary(string op: "*")(const B b) { return new C(); } D opBinary(string op: "+")(const B b) { return new D(); } bool var() { return m_var; } }; auto hellArithmetics(A, B)(A a, B b) { if(a.var) { return a * b; } return a + b; } int main() { auto a1 = new A(true); auto a2 = new A(false); auto b = new B; C c1 = hellArithmetics(a1, b); C c2 = hellArithmetics(a2, b); return 0; } |
Сообщ.
#244
,
|
|
|
Цитата applegame @ Функция должна вернуть несколько значений, и хочется чтобы доступ к значениям был бы как к полям структуры, а не по индексу, как в обычном плюсовом кортеже. А почему не объявить структуру и не вернуть её из функции? Изврата захотелось? Типа Это через какую только жопу гланды не выдирают вместо того, чтобы сделать функции, возвращающие несколько значений, как, например, в Go. Впрочем, хотите через жопу - получите. Гораздо лучше дишных извращений на пустом месте. |
Сообщ.
#245
,
|
|
|
Цитата MyNameIsIgor @ У меня таких функций вагон и маленькая тележка, извратом будет как раз объявлять вагон и маленькую тележку структур.А почему не объявить структуру и не вернуть её из функции? Изврата захотелось? Цитата MyNameIsIgor @ О да, это же какая жопа написать packTuple!(...) или просто tuple(...), если обычного кортежа достаточно.Это через какую только жопу гланды не выдирают вместо того, чтобы сделать функции, возвращающие несколько значений, как, например, в Go. Цитата MyNameIsIgor @ Это простите, херня, никакого отношения к сабжу не имеющая.Впрочем, хотите через жопу - получите. Гораздо лучше дишных извращений на пустом месте. Вы батенька, как всегда, пукаете в лужу. "Если C++ что-то не умеет, то это не нужно" - вот ваш девиз. Научитесь уже отвечать по существу. |
Сообщ.
#246
,
|
|
|
Цитата applegame @ У меня таких функций вагон и маленькая тележка И зачем? Цитата applegame @ извратом будет как раз объявлять вагон и маленькую тележку структур Нет, это будет явная декларация. Цитата applegame @ Это простите, херня Не прощаю. А за нецензурную брань модератор взыщет. Цитата applegame @ никакого отношения к сабжу не имеющая Т.е. если что-то сделали иным способом, нежели ваш, то к теме это отношения не имеет? ![]() Цитата applegame @ Вы батенька, как всегда, пукаете в лужу А вы продолжаете нюхать ![]() Цитата applegame @ "Если C++ что-то не умеет, то это не нужно" - вот ваш девиз Нет, я лишь предлагаю делать по-уму. Уже посмотрели как возвращаются несколько значений в Go? Это во-первых. Во-вторых, вы плюсы на уровне второклашки то не осилили, откуда вам знать, что они могут? |
![]() |
Сообщ.
#247
,
|
|
Цитата applegame @ Молодец! Сам упомянул компилятор. А ну-ка, покажи, как компилятор разгребёт комменты. И с чего он вообще будет это делать. В Плюсах auto с последующим decltype введены для упрощения квалификацированных идентификаторов, каковые становятся возможны только после списка параметров, а отнюдь не для автовывода типа результата. Автовывод, конечно, есть, но для частных случаев.Все прекрасно. Информация дается в комментариях, а не в безумном decltype, который, кстати, может содержать трехэтажные конструкции. Эту работу, ИМХО, может и должен делать компилятор. Цитата applegame @ Та ладно. И как давно это так? Даже без extern template это встречалось нередко. Интерфейс интерфейсом, но параметризация шаблонов отнюдь не ограничивается пользовательскими желаниями, нередко эта параметризация выбирает платформенные специализации, а в этом случае обычная раздельная компиляция вполне применима и легко реализуется. Особенно если учесть, что интерфейсы шаблонов функций без тела этих функций полезны в C++ чуть более, чем никогда. |
Сообщ.
#248
,
|
|
|
Цитата applegame @ Вспомнил про затихший холиворчик. Продолжу продвижение D. Функция должна вернуть несколько значений, и хочется чтобы доступ к значениям был бы как к полям структуры, а не по индексу, как в обычном плюсовом кортеже. Вот эта маленькая магия сама объявляет структуру с полями названными как переменные переданные в параметры и заполняет ее значениями из этих же переменных. Структура объявляется внутри функции (кстати, а плюсы так умеют?), а значит не гадит в глобальную область видимости. Рекурсивный миксин плюс немножко статической рефлексии. Дешево, сердито и красиво, плюсики так не умеют и вряд ли когда сумеют: http://dpaste.dzfl.pl/d09ce6ded86b ![]() ![]() template packTuple(ARGS...) { template Decls(alias value, ARGS...) { mixin("typeof(value)" ~ __traits(identifier, value) ~ ";"); static if(ARGS.length) mixin Decls!ARGS; } struct Tuple { mixin Decls!ARGS; } auto packTuple() { return Tuple(ARGS); } } auto foo() { int fieldInt = 10; string fieldString = "test"; return packTuple!(fieldInt, fieldString); } void main() { auto result = foo(); assert(result.fieldInt == 10); assert(result.fieldString == "test"); } Не очень понял, что ты этим выиграл. Коллеги твои вряд ли будут довольны. Да и ты сам через полгодика не обрадуешься. |
Сообщ.
#249
,
|
|
|
Цитата applegame @ Информация дается в комментариях, а не в безумном decltype В комментариях? Информация о типах? В языке со статической типизацией? Мда.. А как же самодокументируемость? Нет, я за возможность как указания типа, так и явного decltype/typeof. Кстати, в D же это возможно, о чем ты споришь? В C++14 обязательность decltype уходит. |
Сообщ.
#250
,
|
|
|
Цитата D_KEY @ Уже больше времени прошло, и никаких проблем. Удобно, всем наоборот нравится. Я же не везде его пихаю. Там где название типа действительно важно, я указываю его явно. Но в проекте много всяких хелперов, мелких вспомогательных функций и шаблонов, где в общем-то глубоко начхать на название типа. Название функции говорит само за себя, а в комментах описано, что именно она возвращает.Не очень понял, что ты этим выиграл. Коллеги твои вряд ли будут довольны. Да и ты сам через полгодика не обрадуешься. Цитата D_KEY @ Зачем о типах? Описание возвращаемого значения и все. Тип не важен. Типы пусть знает и проверяет компилятор.В комментариях? Информация о типах? В языке со статической типизацией? Мда.. Одно из преимуществ D, что он при желании позволяет писать в стиле динамических языков. Автоматическое выведение типов, auto и прочие радости. Легкость работы с динамическими языками, но при этом типизация статическая, что позволяет ошибки с типами находить compile-time. Можно до последнего цепляться за древний уродливый стиль с громоздкими иерархиями классов, тоннами типов объявленных явно и т.п., но это прошлый век. Даже сам C++ эволюционирует, внезапно, может и не совсем по пути D, но явно в туже сторону Цитата D_KEY @ Обязательность и напрягает. Представь что функция возвращает тип, который можно вывести, но только этот тип будет занимать три строчки кода. Информативность таких кракозябров (особенно в C++) - нулевая. Какая-нибудь лямбда со страшной сигнатурой. А может и не лямбда, может быть функтор, да что угодно, главное что callable. Плевать на тип, главное, что потом с этим значением можно делать.Кстати, в D же это возможно, о чем ты споришь? В C++14 обязательность decltype уходит. Цитата D_KEY @ Ага, я же говорю дрейфуем туда, куда D ушел уже давным давно. В C++14 обязательность decltype уходит. |
Сообщ.
#251
,
|
|
|
Так о толку то от твоего "давным давно"?
![]() Добавлено Цитата applegame @ Цитата D_KEY @ Зачем о типах? Описание возвращаемого значения и все. Тип не важен.В комментариях? Информация о типах? В языке со статической типизацией? Мда.. Имена полей - это тоже информация о типе. Добавлено Возможно, ты и прав, но лично я никакого профита от D не вижу... Даже от Go больше потенциальной пользы, как мне кажется. За счёт простоты. Хотя и от него я не в восторге. |
Сообщ.
#252
,
|
|
|
http://habrahabr.ru/post/183488/
Цитата D_KEY @ Дело вкуса, наверное. Для меня профит прост: один и тот же код я пишу на C++ значительно медленнее, чем на D.Возможно, ты и прав, но лично я никакого профита от D не вижу... Даже от Go больше потенциальной пользы, как мне кажется. За счёт простоты. Хотя и от него я не в восторге. C++ гораздо "многословнее", а метапрограммирование заметно запутаннее. P.S. Вот кстати статейка на хабре в тему - http://habrahabr.ru/post/183488/ |
Сообщ.
#253
,
|
|
|
Так на Питоне задачи ещё быстрее решаются
![]() |
![]() |
Сообщ.
#254
,
|
|
Цитата D_KEY @ В C++14 Кстати, а он действительно "14" будет? Или они опять слишком оптимистичны? ![]() |
![]() |
Сообщ.
#255
,
|
|
Цитата OpenGL @ Кстати, а он действительно "14" будет? Или они опять слишком оптимистичны? Ну может как раз до C++0xF дотянут. =) |