У меня есть шаблонный класс контейнера, который выглядит следующим образом:C++: значения по умолчанию для аргументов шаблона, отличные от последних?
template<
class KeyType,
class ValueType,
class KeyCompareFunctor = AnObnoxiouslyLongSequenceOfCharacters<KeyType>,
class ValueCompareFunctor = AnObnoxiouslyLongSequenceOfCharacters<ValueType>
>
class MyClass
{
[...]
}
Это означает, что, когда я создаю экземпляр объекта этого класса, я могу сделать это несколькими способами:
MyClass<MyKeyType, MyValueType> myObject;
MyClass<MyKeyType, MyValueType, MyCustomKeyCompareFunctor> myObject;
MyClass<MyKeyType, MyValueType, MyCustomKeyCompareFunctor, MyCustomValueCompareFunctor> myObject;
Это все хорошо. Проблема возникает, когда я хочу создать экземпляр MyClass, который использует нестандартную версию аргумента ValueCompareFunctor, но я все же хочу использовать значение по умолчанию аргумента KeyCompareFunctor. Тогда я должен написать это:
MyClass<MyKeyType, MyValueType, AnObnoxiouslyLongSequenceOfCharacters<MyKeyType>, MyCustomValueCompareFunctor> myObject;
Было бы гораздо удобнее, если я каким-то образом мог опустить третий аргумент и просто написать это:
MyClass<KeyType, ValueType, MyCustomValueCompareFunctor> myObject;
Поскольку MyCustomValueCompareFunctor работает только на объекты типа MyValueType а не на объекты типа MyKeyType, похоже, что компилятор мог бы хотя бы теоретически разобраться, что я имел в виду здесь.
Есть ли способ сделать это на C++?
Возможно, вы можете что-то сделать с помощью метапрограммирующих трюков. Но подумайте о том, что произойдет, когда ваш ключ и тип значения будут одинаковыми. Почему не используется typedef для вашего экземпляра? (Обратите внимание, что C++ 0X имеет псевдонимы шаблонов, которые могли бы вам помочь в будущем.) – AProgrammer
Возможно, вы уже это пробовали: если используемый KeyCompareFunctor используется по умолчанию чаще, то в определении переключайте KeyCompareFunctor и ValueCompareFunctor. Таким образом, вы можете просто опустить последний параметр шаблона. – Indy9000
См. Http://www.informit.com/articles/article.aspx?p=31473 –