У меня есть шаблонная функция 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"?