Решение, показанное Леоном, является каноническим. Немного базовых знаний: это называется «(функция) метафункция», потому что это в основном «функция», которая оценивается во время компиляции. Вместо значений он работает с типами: есть список типов ввода (аргументы типа) и есть «возвращаемое значение»: typedef, который объявляет имя типа «тип».
«Вызов» работает аналогично обычному вызову функции, хотя и с другим синтаксисом:
// Normal function
result = f(args);
// Metafunction
typedef f<args>::type result;
Эта конструкция кода часто используется в библиотеках, таких как библиотеки Boost, и даже в STL в одном месте: allocator_type::rebind<U>::other
выполняет то же самое с той лишь разницей, что typedef type
называется other
.