Здравствуйте, 11molniev, Вы писали:
1>Как работать то должно? Какую задачу (кроме демонстрации лямбд) этот код должен решить, что на входе, что на выходе? 1>Ну и как выше подметили, не хотелось бы видеть такое в реальных проектах.
Ну то, что компилятор C++ от MS давно отстал от конкурентов и превратился в убогое недоразумение, ни для кого не новость. А вот для компилятора от Intel похоже кто-то забыл включить поддержку C++14... )
Что касается самого кода, то он демонстрирует альтернативную (т.к. в C++ и так есть std::tuple) реализацию кортежей, на замыканиях. А так же работу с ними (слияние, применение функции). Кстати, этот пример должен быть весьма актуален как раз для C# — там же стандартные кортежи очень забавные, кажется максимум на 8 элементов, да? )))
_>>Фраза "исправили старый косяк" подразумевает, что в тоже время было известно правильное решение. Можно узнать в каком именно языке оно присутствовало? ) 1>Ха! Нужно поискать язык где бы оно отсутствовало. Сам факт лишних копирований был вызван таким подходом к семантике ссылок и увлечением абстракциями ООП. За абстракции всегдла надо платить.
Т.е. снова сравниваем разную функциональность? ) Естественно, что если делать убогую реализацию без RAII и со сборщиком мусора, то нет проблем. Два простейших примера:
1. У нас есть отдельные строки (по гигабайту каждая, для остроты ощущений) и пустой массив строк. Мы хотим положить одну строку в массив. Но чтобы при этом естественно не происходило копирования гигабайта. Ну и само собой при удаление массива все строки в нём должны удаляться.
— C: можно наколбасить руками эффективную реализацию
— Java/C#: работает автоматически, но не эффективно (сборщик мусора со всеми печальными последствиями из этого)
— C++: работает автоматически и эффективно
— так какой там язык давно имел эффективное автоматическое решение данной проблемы?
2. У нас есть объект, инкапсулирующий в себе некое соединение по сети и пустой массив такого же типа. Мы хотим положить этот объект в массив. Естественно мы хотим, чтобы при удаление массива все соединения закрывались.
— C: можно наколбасить руками эффективную реализацию
— Java/C#: можно наколбасить руками эффективную реализацию
— C++: работает автоматически и эффективно
— так какой там язык давно имел эффективное автоматическое решение данной проблемы?
_>>Так вот не стоит путать метапрограммирование и обобщённое программирование — это абсолютно разные парадигмы, предназначенные для решения совершенно разных задач. И да, обобщённое программирование в C# и C++ не сильно отличается. Но здесь то речь не о нём. Хотя возможно кого-то путает тот факт, что для метапрограммирования в C++ в основном используются те же самые шаблоны, что и для обобщённого (и как раз поэтому МП в C++ достаточно кривое, т.к. изначально шаблоны разрабатывались именно для ОП), хотя и по другому. Но из этого точно невозможно сделать вывод о наличие МП в C# — там нет ничего похожего в принципе. ))) 1>Технически метапрограммирование есть и в чистом С, через препроцессор. Что ты подразумеваешь под метапрограммированием. Особенно интересно в плане метапрограммирование vs кодогенерация (T4), метапрограммирование vs препроцессор и метапрограммирование vs метаморфизм в реалтайме.
Да, препроцессор в C тоже является метапрограммированием. Но безусловно на порядок более убогим) Как собственно и все препроцессоры, которые не умеют работать в терминах языка. Это так сказать МП прошлого века)
Любую внешнюю кодогенерацию вообще не имеет смысла упоминать при сравнение языков, т.к. она не имеет никого отношения к данному вопросу. А то такими темпами можно будет включить например пакет Mathematica в C++ (а что, оно же умеет генерировать соответствующий код?). )))
МП в реалтайме является стандартным инструментом (хотя частенько его рекомендуют избегать, т.к. слишком опасная штука) динамических языков. Использовать подобное в статическом языке можно только от жесткой безысходности. )))
В общем, если подвести итог, то можно сказать, что МП:
— в Java/C# просто нет
— в C++ есть, криво-косое
— в D, Nemerle и т.п. есть, нормальное.
Но есть один нюанс: мейнстрим языками тут являются только первые три... )