
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 14 15 [16] 17 18 ... 77 78 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#226
,
|
|
Не, не то. Результатом typeof(expr) является тип результата выражения expr. И если typeof встречается где-то в программе, семантически это будет эквивалентным тому, как если бы где-то был записан typedef, который каким-нибудь идентификатором именует этот самый тип результата expr, а на месте typeof стоял этот самый идентификатор, ведённый typedef-ом. Я так считал. Но возможно, что считал неправильно, потому как не юзал никогда typeof из-за его непереносимости. Почитав же о decltype, я сложил мнение, что они неэквивалентны.
|
![]() |
Сообщ.
#227
,
|
|
Цитата Qraizer @ Почитав же о decltype, я сложил мнение, что они неэквивалентны. В каком месте? Ну, можешь считать, что где-то появляется typedef с уникальным именем. Можешь считать, что просто вместо выражения typeof/decltype подставляется тип. Семантически разница в чем заключается? |
![]() |
Сообщ.
#228
,
|
|
Цитата archimed7592 @ Ну так я об этом и спрашивал. "Всё что знал, всё сказал" ©, а дальше был вопрос Семантически разница в чем заключается? Цитата Qraizer @ В драфте decltype описывается бо́льшим количеством пунктов. Кроме того, семантика decltype всё-таки чуток отличается от семантики typeof, или я не прав? |
![]() |
Сообщ.
#229
,
|
|
Цитата Qraizer @ Ну так я об этом и спрашивал. "Всё что знал, всё сказал" ©, а дальше был вопрос Ну, в той степени, в которой ты раскрыл семантику typeof - нет, семантика decltype ничем не отличается ![]() |
Сообщ.
#230
,
|
|
|
David Vandevoorde and Nicolai M. Josuttis
Пишут о typeof следующее При написании шаблонов часто полезно иметь возможность указать тип выражения, зависящего от шаблона. Наглядным примером такой ситуации является объявление арифметической операции для шаблона числового массива, в котором типы операндов различны. Следующий пример должен прояснить данную мысль: ![]() ![]() template <typename Tl, typename T2> Array<???> operator+(Array<Tl>const& x, Array<T2>const& y); Предположительно эта операция должна создать массив элементов, которые являются результатом сложения соответствующих элементов массивов х и у. Таким образом, результирующий элемент будет иметь тип х [0] +у [0]. К сожалению, в языке C++ отсутствует надежный способ выражения этого типа с помощью Т1 и Т2. В качестве расширения, направленного на решение этого вопроса, в некоторых компиляторах имеется операция typeof. Она напоминает операцию sizeof тем, что позволяет получить из исходного выражения некоторый объект времени компиляции, но в данном случае этот объект может выступать в качестве имени типа. Тогда предыдущий пример можно записать следующим образом: ![]() ![]() template <typename Tl, typename T2> Array<typeof(Tl()+T2())> operator + (Array<Tl> const& x, Array<T2> const& y); Очень даже неплохо, но не идеально. Действительно, здесь предполагается, что данные типы могут быть инициализированы по умолчанию. Это можно обойти, вводя вспомогательный шаблон. ![]() ![]() template <typename T> Т makeTO; // Определение не требуется template <typename Tl, typename T2> Array<typeof(makeT<Tl>()+makeT<T2>() ) > operator + (Array<Tl> const& x, Array<T2> const& y); В аргументе typeof мы бы предпочли использовать х и у, но не можем этого сделать, так как они не были объявлены в точке расположения конструкции typeof. Радикальное решение этой проблемы заключается в том, чтобы ввести альтернативный синтаксис объявления функции, в котором возвращаемый тип помещается после параметров. // Шаблон функции оператора: ![]() ![]() template <typename Tl, typename T2> operator + (Array<Tl> constfc x, Array<T2> constfc y) -> Array< typeo f(x+y)>; // Шаблон регулярной функции: ![]() ![]() template <typename Tl, typename T2> function exp(Array<Tl> const& x, Array<T2> const& y) -> Array<typeof(exp(x,y))> Как видно из этого примера, новый синтаксис для неоператорных функций включает новое ключевое слово, в данном случае— function (чтобы выполнить процесс синтаксического анализа для операторных функций, достаточно ключевого слова operator). Обратите внимание, что операция typeof должна быть операцией времени компиляции. В частности, как видно из следующего примера, операция typeof не принимает во внимание ковариантные возвращаемые типы. ![]() ![]() class Base { public: virtual Base clone(); }; class Derived : public Base { public: virtual Derived clone(); // Ковариантный возвращаемый тип }; void demo (Base* p, Base* q) { typeof(p->clone()) tmp = p->clone(); ( // tmp всегда будет иметь тип Base } |
![]() |
Сообщ.
#231
,
|
|
Большой, классная книжка. Я не видел другой, также подробно описывающей шаблоны.
|
Сообщ.
#232
,
|
|
|
Известно,что в STL отсутствует алгоритм copy_if будет ли он в новом стандарте и вооще какие будут еще алгоритмы если будут конечно.
|
![]() |
Сообщ.
#233
,
|
|
Цитата Большой @ Известно,что в STL отсутствует алгоритм copy_if Really? ![]() Мне неизвестно ![]() Посмотри на remove_copy_if. Думаю, это - как раз то, что ты понимаешь под copy_if. |
Сообщ.
#234
,
|
|
|
archimed7592
а вот мейерс утверждает, что нет |
![]() |
Сообщ.
#235
,
|
|
Цитата Большой @ а вот мейерс утверждает, что нет Извини, я не совсем понимаю, что именно он утверждает? То, что нет алгоритма копирования последовательности с заданным фильтром? Если да, то хотелось бы увидеть его слова дословно и в оригинале ![]() |
Сообщ.
#236
,
|
|
|
С. Мейерс
"Эффективное использование STL" совет 36. Правильно используйте copy_if В STL имеется 11 алгоритмов, в именах которых присутствует слово сору. Но как ни странно, алгоритма copy_if среди них нет. Таким образом, вы можете вызывать replace_copy_if и remove_copy_if, к вашим услугам copy_backward и reverse_copy, но если вдруг потребуется просто скопировать элементы интервала, удовлетворяющие определенному предикату, вам придется действовать самостоятельно. Добавлено archimed7592 Хотя меня больше интересуют новые алгоритмы |
![]() |
Сообщ.
#237
,
|
|
Большой, по поводу copy_if - смешно
![]() Добавлено Цитата Большой @ Хотя меня больше интересуют новые алгоритмы Появились новые алгоритмы, модифицировались "старые"(в сторону поддержки концептов, rvalue references, intializers). Если интересуют подробности, то можешь скачать текущий черновик(который по сути является почти чистовиком) и сравнить с версией 2003 года. Версия 2003 года лежит в FAQ, последний черновик - на open-std.org. Раздел 25 Algorithms library. |
Сообщ.
#238
,
|
|
|
archimed7592
Да разобрался оказывается transorm общий случай копирования с условием. А что такое Atomic operations library и с чем его едят? |
![]() |
Сообщ.
#239
,
|
|
Цитата Большой @ А что такое Atomic operations library и с чем его едят? Библиотека для совершения атомарных операций ![]() Едят с многопоточностью. |
Сообщ.
#240
,
|
|
|
Цитата archimed7592 @ Едят с многопоточностью. а как ? мона небольшой пример. плизззз |