Здравствуйте. Возникла проблема при написании одной из имплементаций Ахо-Корасик.
Вот ссылка сразу на код(пока что чисто полурабочая заготовка):http://pastebin.com/yc0LUDA0
Проблема вот в чём: обратите внимание на BorNode. У него внутри есть unordered_map<char, BorNode*>. Нужно это дело кастомизировать извне с помощью шаблонов. Что значит кастомизировать: мы можем менять тип контейнера - std::map/std::unordered_map, менять дефолтные std::hash, std::less у них и так далее, само собой, char тоже должны уметь менять на произвольный T.
С этим у меня возникла сложность, так как я не смог написать такой универсальный шаблон и проинстанцировать его.
Что я делал раньше: до того, как у меня были BorNode, у меня были просто size_t индексы нод в std::vector. И выглядело всё так:
template<typename T, typename Map, typename ResultCont = std::vector<std::vector<T>>>
class Base_Aho_Corasik{...}
template<typename T, typename Compare = std::less<T>, typename Alloc = std::allocator<std::pair<const T, size_t>>,
typename ResultCont = std::vector<std::vector<T>>>
using Aho_Corasik = Base_Aho_Corasik<T, std::map<T, size_t, Compare, Alloc>, ResultCont>;
template<typename T, typename Hash = std::hash<T>, typename Pred = std::equal_to<T>,
typename Alloc = std::allocator<std::pair<const T, size_t>>,
typename ResultCont = std::vector<std::vector<T>>>
using Aho_Corasik_Hash = Base_Aho_Corasik<T, std::unordered_map<T, size_t, Hash, Pred, Alloc>, ResultCont>;
А как похожую вещь сделать с BorNode* вместо size_t я без понятия. У кого какие идеи? В выборе стандарта ограничений нет, можно использовать Boost.