Хобрук: Ваш путь к мастерству в программировании

Шаблонные пространства имен и определения типов являются незаконными обходными путями?

У меня есть шаблонная функция fct, которая использует некоторую сложную структуру данных на основе параметра шаблона. Он также вызывает некоторые вспомогательные функции (шаблоны того же типа), которые находятся в отдельном пространстве имен helpers и используют ту же сложную структуру данных. Теперь это становится действительно уродливым, потому что мы не можем сделать один typedef для сложного типа, к которому могут обращаться все функции:

namespace helpers {
  template<class T>
  void h1(const std::vector< std::vector< std::map<T, std::set<T> > > >& bar){
    // ...
  }
}

template<class T>
void fct(const std::vector< std::vector< std::map<T, std::set<T> > > >& bar){
  // ...
  helpers::h1(bar);
}

Теперь я хочу сделать его красивее, используя одно определение типа, которое могут использовать все функции.

Шаблонный typedef был бы хорош, но это не разрешено:

template<class T> 
typedef std::vector< std::vector< std::map<T, std::set<T> > > > Bar;

Другим решением, я думаю, было бы обернуть все эти функции в шаблонный namespace, но это также не разрешено в C++ (я слышал, что это будет в `C++0x'...).

Конечно, у нас есть шаблонные классы, но обратите внимание, что я действительно не хочу, чтобы пользователю приходилось создавать объект и вызывать для него функции-члены. Таким образом, обходной путь, который я использовал, заключался в использовании шаблонного класса, где все функции-члены static:

template<class T>
class All {

  typedef std::vector< std::vector< std::map<T, std::set<T> > > > Bar;

  static void fct(const Bar& bar){
    // ...
    h1(bar);
  }

private:
  static void h1(const Bar& bar){
    // ...
  }
};

Мой вопрос: наверное, это немного забавно, если большие части моего кода организованы таким образом? В конце концов, немного необычно иметь много классов только со статическими функциями-членами? Существуют ли другие решения/обходной путь, которые делают возможным использование «шаблона typedef»/«шаблона пространства имен»?



Ответы:


1

Существуют ли другие решения/обходной путь, которые делают возможным использование «шаблона typedef»/«шаблона пространства имен»?

GOTW #79: Определение типа шаблона

Новые шаблоны Typedef C++ (см. Раздел 1: Проблема и текущие обходные пути)

15.04.2009
  • Я собирался предложить то же решение, что и в GOTW#79: определение трейтов. +1 16.04.2009

  • 2

    Для тех, кто читает этот вопрос в мире после C++11: в C++11 существует есть шаблонный typedef, он называется `using' (который на самом деле может полностью заменить typedef. В контексте вопроса, вот что мы делаем:

    template<class T> 
    using Bar = std::vector< std::vector< std::map<T, std::set<T> > > >;
    
    namespace helpers {
    template<class T>
    void h1(const Bar<T>& bar){
        // ...
    }
    }
    
    template<class T>
    void fct(const Bar<T>& bar){
      // ...
      helpers::h1(bar);
    }
    

    Красиво и просто. Вроде, как бы, что-то вроде.

    14.03.2016
    Новые материалы

    То, как вы шаг за шагом написали эту статью, и уровни, которые вы в нее включили, так поразительно…
    то, как вы написали эту статью шаг за шагом, и уровни, которые вы в нее включили, так удивительно объяснены, а также то, как вы объясняете каждый пункт, действительно хорошо, и вы поддерживаете..

    Еженедельный гидроксид № 01 — Введение
    Здравствуйте и добро пожаловать в первый выпуск Weekly Hydroxide , еженедельной серии статей о ядре Hydroxide. Мы будем писать о процессе написания ядра операционной системы на Rust, наших..

    Пять вещей, о которых вы должны ДЕЙСТВИТЕЛЬНО побеспокоиться в связи с ИИ
    Несмотря на то, что циркулирует много неточной информации об ИИ, важно исправить частые заблуждения. Многие могут быть обеспокоены тем, что их в конечном итоге заменят роботом, или..

    Тестирование ответов на вопросы на основе BERT по статьям о коронавирусе
    Введение В настоящее время большая часть мира затронута пандемией COVID-19 . Для многих из нас это означало домашний карантин, социальное дистанцирование, перебои в рабочей среде. Я..

    Библиотеки PyTorch и Python для машинного обучения: приложения в здравоохранении с обнимающим лицом…
    В сфере машинного обучения Python выделяется благодаря своей универсальности и набору предлагаемых библиотек. Развитие машинного обучения в здравоохранении можно частично объяснить простотой и..

    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!
    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!

    5 вещей, которые я сделал, чтобы стать профессиональным разработчиком JavaScript
    Чтобы стать профессиональным JS-разработчиком: 1. Практикуйтесь в рутине, 2. Работайте над проектами, 3. Придерживайтесь одного языка, 4. Наблюдайте за чужим кодом, 5. Будьте последовательны..