На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (78) « Первая ... 14 15 [16] 17 18 ...  77 78  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Не, не то. Результатом typeof(expr) является тип результата выражения expr. И если typeof встречается где-то в программе, семантически это будет эквивалентным тому, как если бы где-то был записан typedef, который каким-нибудь идентификатором именует этот самый тип результата expr, а на месте typeof стоял этот самый идентификатор, ведённый typedef-ом. Я так считал. Но возможно, что считал неправильно, потому как не юзал никогда typeof из-за его непереносимости. Почитав же о decltype, я сложил мнение, что они неэквивалентны.
      Цитата Qraizer @
      Почитав же о decltype, я сложил мнение, что они неэквивалентны.

      В каком месте? Ну, можешь считать, что где-то появляется typedef с уникальным именем. Можешь считать, что просто вместо выражения typeof/decltype подставляется тип. Семантически разница в чем заключается?
        Цитата archimed7592 @
        Семантически разница в чем заключается?
        Ну так я об этом и спрашивал. "Всё что знал, всё сказал" ©, а дальше был вопрос
        Цитата Qraizer @
        Кроме того, семантика decltype всё-таки чуток отличается от семантики typeof, или я не прав?
        В драфте decltype описывается бо́льшим количеством пунктов.
        Сообщение отредактировано: Qraizer -
          Цитата Qraizer @
          Ну так я об этом и спрашивал. "Всё что знал, всё сказал" ©, а дальше был вопрос

          Ну, в той степени, в которой ты раскрыл семантику typeof - нет, семантика decltype ничем не отличается :).
            David Vandevoorde and Nicolai M. Josuttis
            Пишут о typeof следующее

            При написании шаблонов часто полезно иметь возможность указать тип выражения,
            зависящего от шаблона. Наглядным примером такой ситуации является объявление
            арифметической операции для шаблона числового массива, в котором типы операндов
            различны. Следующий пример должен прояснить данную мысль:
            ExpandedWrap disabled
              template <typename Tl, typename T2>
              Array<???> operator+(Array<Tl>const& x, Array<T2>const& y);

            Предположительно эта операция должна создать массив элементов, которые
            являются результатом сложения соответствующих элементов массивов х и у. Таким образом,
            результирующий элемент будет иметь тип х [0] +у [0]. К сожалению, в языке C++
            отсутствует надежный способ выражения этого типа с помощью Т1 и Т2.
            В качестве расширения, направленного на решение этого вопроса, в некоторых
            компиляторах имеется операция typeof. Она напоминает операцию sizeof тем, что
            позволяет получить из исходного выражения некоторый объект времени компиляции, но в
            данном случае этот объект может выступать в качестве имени типа. Тогда предыдущий
            пример можно записать следующим образом:
            ExpandedWrap disabled
              template <typename Tl, typename T2>
              Array<typeof(Tl()+T2())> operator + (Array<Tl> const& x,
              Array<T2> const& y);

            Очень даже неплохо, но не идеально. Действительно, здесь предполагается, что
            данные типы могут быть инициализированы по умолчанию. Это можно обойти, вводя
            вспомогательный шаблон.
            ExpandedWrap disabled
              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. Радикальное
            решение этой проблемы заключается в том, чтобы ввести альтернативный синтаксис
            объявления функции, в котором возвращаемый тип помещается после параметров.
            // Шаблон функции оператора:
            ExpandedWrap disabled
              template <typename Tl, typename T2>
              operator + (Array<Tl> constfc x, Array<T2> constfc y)
              -> Array< typeo f(x+y)>;

            // Шаблон регулярной функции:
            ExpandedWrap disabled
              template <typename Tl, typename T2>
              function exp(Array<Tl> const& x, Array<T2> const& y)
              -> Array<typeof(exp(x,y))>

            Как видно из этого примера, новый синтаксис для неоператорных функций включает
            новое ключевое слово, в данном случае— function (чтобы выполнить процесс
            синтаксического анализа для операторных функций, достаточно ключевого слова operator).
            Обратите внимание, что операция typeof должна быть операцией времени
            компиляции. В частности, как видно из следующего примера, операция typeof не принимает
            во внимание ковариантные возвращаемые типы.
            ExpandedWrap disabled
              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
              }
              Большой, классная книжка. Я не видел другой, также подробно описывающей шаблоны.
                Известно,что в STL отсутствует алгоритм copy_if будет ли он в новом стандарте и вооще какие будут еще алгоритмы если будут конечно.
                  Цитата Большой @
                  Известно,что в STL отсутствует алгоритм copy_if

                  Really? :)
                  Мне неизвестно :rolleyes:.
                  Посмотри на remove_copy_if. Думаю, это - как раз то, что ты понимаешь под copy_if.
                    archimed7592
                    а вот мейерс утверждает, что нет
                      Цитата Большой @
                      а вот мейерс утверждает, что нет

                      Извини, я не совсем понимаю, что именно он утверждает? То, что нет алгоритма копирования последовательности с заданным фильтром? Если да, то хотелось бы увидеть его слова дословно и в оригинале :rolleyes:.
                        С. Мейерс
                        "Эффективное использование STL"
                        совет 36. Правильно используйте copy_if

                        В STL имеется 11 алгоритмов, в именах которых присутствует слово сору.
                        Но как ни странно, алгоритма copy_if среди них нет. Таким образом, вы можете вызывать replace_copy_if и remove_copy_if, к вашим услугам copy_backward и reverse_copy, но если вдруг потребуется просто скопировать элементы интервала, удовлетворяющие определенному предикату, вам придется действовать самостоятельно.

                        Добавлено
                        archimed7592
                        Хотя меня больше интересуют новые алгоритмы
                          Большой, по поводу copy_if - смешно :). Непонятно, как это у Мейрса оказалось... Суть в том, что в STL отсутсвует великое множество алгоритмов, которые могли бы быть очень полезны(как copy_if, к примеру), но присутсвуют кирпичики из которых все эти полезные алгоритмы можно построить. Тот же copy_if который имеет ввиду Мейрс - это remove_copy_if с отрицанием предиката(я уверен, далее по тексту это упоминается).

                          Добавлено
                          Цитата Большой @
                          Хотя меня больше интересуют новые алгоритмы

                          Появились новые алгоритмы, модифицировались "старые"(в сторону поддержки концептов, rvalue references, intializers). Если интересуют подробности, то можешь скачать текущий черновик(который по сути является почти чистовиком) и сравнить с версией 2003 года. Версия 2003 года лежит в FAQ, последний черновик - на open-std.org. Раздел 25 Algorithms library.
                            archimed7592
                            Да разобрался оказывается transorm общий случай копирования с условием.

                            А что такое Atomic operations library
                            и с чем его едят?
                            Сообщение отредактировано: Большой -
                              Цитата Большой @
                              А что такое Atomic operations library
                              и с чем его едят?

                              Библиотека для совершения атомарных операций :).
                              Едят с многопоточностью.
                                Цитата archimed7592 @
                                Едят с многопоточностью.

                                а как ?
                                мона небольшой пример.
                                плизззз
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (78) « Первая ... 14 15 [16] 17 18 ...  77 78


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0590 ]   [ 16 queries used ]   [ Generated: 18.06.25, 20:00 GMT ]