Как я могу специализировать стандартную карту для нескольких типов ключей? - PullRequest
2 голосов
/ 30 июня 2011

У меня есть подкласс std :: map

template<class ValueT>
FancyKeyMap
    : public std::map<FancyKey,ValueT, FancyKey::Less>
{
     ...
public:
     inline iterator find(FancyKeyArg key)
     {
         return(std::map<FancyKey,ValueT,
                FancyKey::Less>::find(FancyKeyArg.makeKeyRef()));
     }  
};

, это прекрасно работает (не спрашивайте, почему я не хочу использовать какое-либо имплицитное преобразование, это вызывает слишком много неоднозначных перегрузок и полное преобразованиев этом случае это дорого:)

в любом случае было бы неплохо, если бы вышеприведенное могло быть специализацией std :: map, где любой

std::map<FancyKey,ValueT> fancymap;

woudl делает то же самое, что и

FancyKeyMap<ValueT> fancyMap;

можно ли сделать этот тип специализации?


Хорошо, только что попытался частичной специализации:

namespace std {

template<class ValT, class CompareT=FancyKey::Less, 
         class AllocT=allocator<pair<const FancyKey,ValT> > >
    class map<FancyKey, ValT, CompareT, AllocT>
{
     ....
};

}

Я получаю эту ошибку:

«аргументы по умолчанию не допускаются при частичной специализации»

, но для того, чтобы он действовал как std :: map, он должен иметь «унаследованные» аргументы по умолчанию и , позволяющие их переопределять.Следующий шаг - это возможно?

Я видел предложение по поиску часто задаваемых вопросов по шаблону. Похоже, это очень распространенный вопрос; ^>

1 Ответ

0 голосов
/ 30 июня 2011

Это кажется большой проблемой, чтобы не набирать makeKeyRef()find вызовах) и не быть более явным в отношении намерения в то же время. Рассматривали ли вы просто дополнительный набор текста и разъяснение своих намерений будущим сопровождающим?

Кроме того, поскольку стандартные контейнеры не имеют виртуальных деструкторов, если вы не публикуете их публично, вы открываете себя неопределенному поведению, когда один из них уничтожается указателем базового класса.

...