ich meine Templat-Container-Klasse haben, die wie folgt aussieht:C++: Standardwerte für andere Template-Argumente als die letzten?
template<
class KeyType,
class ValueType,
class KeyCompareFunctor = AnObnoxiouslyLongSequenceOfCharacters<KeyType>,
class ValueCompareFunctor = AnObnoxiouslyLongSequenceOfCharacters<ValueType>
>
class MyClass
{
[...]
}
Was bedeutet, dass, wenn ich ein Objekt dieser Klasse instanziiert, ich kann es mehrere verschiedene Arten tun:
MyClass<MyKeyType, MyValueType> myObject;
MyClass<MyKeyType, MyValueType, MyCustomKeyCompareFunctor> myObject;
MyClass<MyKeyType, MyValueType, MyCustomKeyCompareFunctor, MyCustomValueCompareFunctor> myObject;
alle, sind gut. Das Problem tritt auf, wenn ich eine MyClass instanziieren möchte, die eine nicht standardmäßige Version des ValueCompareFunctor-Arguments verwendet, aber ich möchte weiterhin den Standardwert des KeyCompareFunctor-Arguments verwenden. Dann muß ich schreiben:
MyClass<MyKeyType, MyValueType, AnObnoxiouslyLongSequenceOfCharacters<MyKeyType>, MyCustomValueCompareFunctor> myObject;
Es wäre viel bequemer, wenn ich irgendwie das dritte Argument weglassen könnte und nur schreiben, um diese:
MyClass<KeyType, ValueType, MyCustomValueCompareFunctor> myObject;
Da das MyCustomValueCompareFunctor nur auf Objekte vom Typ MyValueType arbeitet und nicht auf Objekte vom Typ MyKeyType, es scheint, als könnte der Compiler zumindest theoretisch herausfinden, was ich hier meinte.
Gibt es eine Möglichkeit, dies in C++ zu tun?
Sie könnten vielleicht etwas durch Metaprogrammation Tricks tun. Aber denken Sie darüber nach, was passiert, wenn Ihr Schlüssel und Werttyp identisch sind. Warum nicht eine Typedef für Ihre Instanziierung verwendet? (Beachten Sie, dass C++ 0X Template-Aliase hat, die Ihnen in Zukunft helfen könnten.) – AProgrammer
Sie haben das wahrscheinlich schon versucht: Wenn der KeyCompareFunctor häufiger verwendet wird, dann wechseln Sie in der Definition KeyCompareFunctor und ValueCompareFunctor. Auf diese Weise können Sie den letzten Vorlagenparameter einfach weglassen. – Indy9000
Siehe http://www.informit.com/articles/article.aspx?p=31473 –