Шаблонные пространства имен и typedefs являются идеальными решениями? - PullRequest
1 голос
/ 16 апреля 2009

У меня есть шаблонная функция 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, который могут использовать все функции.

Шаблон 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){
    // ...
  }
};

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

Ответы [ 2 ]

8 голосов
/ 16 апреля 2009

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

GOTW # 79: Шаблон Typedef

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

0 голосов
/ 14 марта 2016

Для любого, кто читает этот вопрос в мире пост-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);
}

Красиво и просто. Вроде.

...