У меня есть шаблонная функция 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»/«шаблона пространства имен»?