На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (77) « Первая ... 47 48 [49] 50 51 ...  76 77  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Подразумевает ли новый стандарт какой-то способ задать функцию с переменным числом аргументов одного типа?
    Допустим есть:
    ExpandedWrap disabled
      template<typename T, typename ... Args>
      void f(const T &a1, const Args& ... args)
      {
         // ...
      }

    Но требуется, чтобы все аргументы были типа T.
    Можно бы было обойтись std::initializer_list<T>, но мне нужно знать количество аргументов во время компиляции, т.е. sizeof...().
    Хотелось бы что-то в духе:
    ExpandedWrap disabled
      template<typename T>
      void f(const T &a1, const T& ... args)
      {
         // ...
      }

    Есть ли какой-то относительно простой способ это сделать?
      D_KEY, а static_assert с проверкой всех Args на идентичность T не подойдёт?
        Цитата MyNameIsIgor @
        D_KEY, а static_assert с проверкой всех Args на идентичность T не подойдёт?

        Можно, конечно, только не красиво... Вроде как есть механизм, но не доделанный(ИМХО).
          Цитата D_KEY @
          Вроде как есть механизм, но не доделанный(ИМХО).

          В чём недоделанный? Ты хочешь перегрузку по указанному типу?
            Цитата MyNameIsIgor @
            В чём недоделанный? Ты хочешь перегрузку по указанному типу?

            Допустим. Впрочем ладно, это уже холивар :) Нет, так нет.
              D_KEY, ты можешь проверять тип каждого параметра на соответствие T. Как-то так, например:
              ExpandedWrap disabled
                template <typename T, typename F, typename ...Args> struct AllSame;
                template <typename T, typename ...Args>             struct AllSame<T, T, Args...> : AllSame <T, Args...> {};
                template <typename T>                               struct AllSame<T, T>                                 {};
                 
                template<typename T, typename ... Args>
                void f(const T &a1, const Args& ... args)
                {
                  AllSame<T, Args...> dummy;
                 
                  // ...
                }
              Сообщение отредактировано: Qraizer -
                Хм... Я что-то не так написал или в натуре просто "ещё не реализовано"? Кто уже вариадики пользовал серьёзно, что тут может быть не по Стандарту?
                  Цитата
                  sorry, unimplemented: cannot expand 'Args ...' into a fixed-length argument list

                  да, это недореализованно.
                    Цитата niXman @
                    Цитата
                    sorry, unimplemented: cannot expand 'Args ...' into a fixed-length argument list

                    да, это недореализованно.


                    а можно по подробнее, что конкретно не реализовано, а то я что-то никак не пойму, откуда тут fixed-length argument list?

                    и в чем его принципиально отличие от следующего кода (который кстати компилируется)
                    ExpandedWrap disabled
                      template<class T, class ... Args> struct all_same;
                      template<class T, class ... Args> struct all_same<T, T, Args ...> : all_same<T, Args...> {};
                      template<class T> struct all_same<T, T> {};
                       
                      template<class T, class ...Args>
                      void f(const T& t, const Args& ... args) {
                          all_same<T, Args...> dummy;
                      }
                      Цитата D_KEY @
                      Есть ли какой-то относительно простой способ это сделать?
                      Писать лень, могу на пальцах прикинуть: аргументы в список типов.
                      далее, по enable_if в возвращаемый результат либо вручную пишешь функтор, проверяющий все ли одинаковы, либо количество повторений должно быть равно длинне списка. Вроде для второго в Loki всё есть.
                        Цитата niXman @
                        да, это недореализованно.
                        Ну это радует. В смысле, радует, что я это правильно себе представляю, мне-то пока негде разгуляться с вариадиками. XandoX, я вот тоже не пойму, чем мешает ещё один шаблонный параметр в первичном шаблоне. Впрочем, для указанного случая это не принципиально. Я сначала предполагал заюзать F, но оказалось, что для нужных частичных специализаций он не требуется, Args и сам справляется.
                        D_KEY, я так полагаю, подобные вещи предполагалось возложить на концепты. Вариадики не виноваты, что с концептами такая неприятность случилась.

                        Добавлено
                        Да, clang съел и не подавился. <_<
                          Жаль, что в новый стандарт так и не ввели синтаксический сахар для реализации свойств объекта. Печаль...
                          Сообщение отредактировано: applegame -
                            Меня глючит, или в C++11 грозились добавить rope? Сейчас полистал Стандарт - нету :no-sad:
                              Цитата MyNameIsIgor @
                              Меня глючит, или в C++11 грозились добавить rope? Сейчас полистал Стандарт - нету :no-sad:

                              Погуглил. Ты про класс для манипулирования очень длинной строкой? Наверное решили, что оно слишком специфично, чтобы запиливать в STL.
                                Цитата MyNameIsIgor @
                                Меня глючит, или в C++11 грозились добавить rope? Сейчас полистал Стандарт - нету :no-sad:

                                Эммм... Может быть для этих целей deque подойдёт?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (77) « Первая ... 47 48 [49] 50 51 ...  76 77


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0923 ]   [ 15 queries used ]   [ Generated: 29.05.24, 02:33 GMT ]