На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (78) « Первая ... 33 34 [35] 36 37 ...  77 78  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Flex Ferrum, на последней вашей сборке тоже не компилится. В thread есть такая директива препроцессора
    ExpandedWrap disabled
      #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)

    Как я понял, она есть false, и код с классом thread просто не существует при компиляции.
      Цитата MyNameIsIgor @
      Как я понял, она есть false, и код с классом thread просто не существует при компиляции.

      Ну, одно из двух. Либо не поправили, либо есть некие ключи конфигурации, которые можно выставить (при сборке), чтобы это заработало.
        Цитата Flex Ferrum @
        либо есть некие ключи конфигурации, которые можно выставить (при сборке)

        При сборке MinGW?
          Цитата MyNameIsIgor @
          При сборке MinGW?

          Ну да.
            Flex Ferrum, ясно. Значит, придётся ставить эксперименты самому :)
              Цитата MyNameIsIgor @
              Flex Ferrum, на последней вашей сборке тоже не компилится. В thread есть такая директива препроцессора
              ExpandedWrap disabled
                #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)

              Как я понял, она есть false, и код с классом thread просто не существует при компиляции.

              в каком файле?
                niXman, там же написано - во thread :)
                Не помню точно путь в винде, но судя по линухе - includes/c++/4.5.0/thread
                  Цитата MyNameIsIgor @
                  там же написано - во thread

                  я изначально не понял, это в бустовских или компилятора хидерах.
                    Не до конца понимаю варианты использования lambda-функции в новом стандарте. Если я хочу объявить multimap с компаратором в виде lambda-функции, то по идее код будет примерно следующим:
                    ExpandedWrap disabled
                      struct A {
                              int i;
                      };
                       
                      std::multimap<int, A,
                              [](A a1, A a2) -> bool {return a1.i < a2.i; }
                      > m;


                    Но компилятор (intel c++ 12 beta с ключём -std=c++0x), который запросто воспринимает lambda в других местах, в таком объявлении не понимает синтаксиса. Возможно ли такое использование lambda-функций?
                    Сообщение отредактировано: ShapovalovTS -
                      ShapovalovTS, аргументом шаблона должен быть тип компаратора, а данное выражение
                      ExpandedWrap disabled
                        [](A a1, A a2) -> bool {return a1.i < a2.i; }

                      создаёт, как я понимаю, именно экземпляр лямбды. И, кстати, в данном случае не обязательно указывать возвращаемый лямбдой тип.
                      Для получения типа лямбды можно использовать decltype как-то так:
                      ExpandedWrap disabled
                        auto f = [](A a1, A a2) {return a1.i < a2.i; };
                        std::multimap<int, A, decltype(f)> m(f);

                      Поскольку для лямбд не гарантируется наличие конструктора по умолчанию, то мы передаём экземпляр лямбды в конструктор multimap'а.

                      Добавлено
                      Кстати, только сейчас заметил :) Компаратор то должен ключи сравнивать, т.е. int'ы в вашем случае, а у вас он сравнивает объекты типа A.
                        MyNameIsIgor, спасибо за ответ, в таком виде компилятор код воспринимает. Со сравнением int-ов - тоже верное замечание.

                        А есть ли в этом случае способ в новом стандарте заменить auto f на что-то типа typedef <lambda-expr> f; в объявлении класса, иначе приходится выносить этот код на уровень выше, чего делать не хотелось бы.
                          Цитата ShapovalovTS @
                          А есть ли в этом случае способ в новом стандарте заменить auto f на что-то типа typedef <lambda-expr> f; в объявлении класса

                          Я немного не понял, что вы хотите сделать. В том то и дело, что тип лямбды нам неизвестен, потому typedef мы можем сделать только с использованием decltype
                          ExpandedWrap disabled
                            auto f = [](A a1, A a2) {return a1.i < a2.i; };
                            typedef decltype(f) some_type;

                          Если же вам нужно, чтобы тип компаратора был виден глобально, то больше смысла будет в создании функтора, так сказать, "по-старинке", а не в использовании лямбды. Всё же лямбда - это что-то для локального использования.

                          Добавлено
                          Или вы хотите в таком виде?
                          ExpandedWrap disabled
                            typedef decltype([](A a1, A a2) {return a1.i < a2.i; }) some_type;

                          Тут нужно знатоков стандарта, ибо я не знаю, законна ли такая конструкция в принципе. Но у меня в gcc 4.5 она не компилировалась.
                          И в таком случае не получится создать экземпляр этого типа. Т.е. код
                          ExpandedWrap disabled
                            some_type f;

                          не скомпилируется, потому что у лямбд нет конструктора по умолчанию.
                          Сообщение отредактировано: MyNameIsIgor -
                            Цитата MyNameIsIgor @

                            Или вы хотите в таком виде?
                            ExpandedWrap disabled
                              typedef decltype([](A a1, A a2) {return a1.i < a2.i; }) some_type;


                            Да, хотелось бы не выносить тип из объявления класса, в котором идет работа с std::multimap. Мой компилятор от Intel тоже отказывается подобное компилировать:
                            ExpandedWrap disabled
                              class B {
                                  struct A {int i;};
                               
                                  typedef decltype([](A a1, A a2) {return a1.i < a2.i; }) some_type;
                              };
                            Сообщение отредактировано: ShapovalovTS -
                              ShapovalovTS, тогда я бы сделал так
                              ExpandedWrap disabled
                                class B {
                                    struct A {int i;};
                                 
                                    struct comparator : public std::binary_function<A, A, bool>
                                    {
                                        bool operator() (const A& first, const A& second) const { return first.i < second.i; }
                                    };
                                    std::multimap<A, int, comparator> m;
                                };
                              Сообщение отредактировано: MyNameIsIgor -
                                Эммм... Что-то вы не то и не с тем мешаете. :)
                                ExpandedWrap disabled
                                  // При объявлении типа мапы:
                                  typedef std::multimap<int, A, std::function<bool (A const&, A const&)>> mmap_type;
                                   
                                  // при объявлении экземпляра мультимапы:
                                  mmap_type m([](A a1, A a2) {return a1.i < a2.i; });

                                Как-то так.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (78) « Первая ... 33 34 [35] 36 37 ...  77 78


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0711 ]   [ 16 queries used ]   [ Generated: 21.06.25, 06:52 GMT ]