【发布时间】:2010-11-15 23:53:02
【问题描述】:
我的模板化容器类如下所示:
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;
这些都很好。当我想实例化一个使用非默认版本的 ValueCompareFunctor 参数的 MyClass 时,问题就出现了,但我仍然想使用 KeyCompareFunctor 参数的默认值。然后我必须写这个:
MyClass<MyKeyType, MyValueType, AnObnoxiouslyLongSequenceOfCharacters<MyKeyType>, MyCustomValueCompareFunctor> myObject;
如果我能以某种方式省略第三个参数而只写这个会更方便:
MyClass<KeyType, ValueType, MyCustomValueCompareFunctor> myObject;
由于 MyCustomValueCompareFunctor 仅适用于 MyValueType 类型的对象,而不适用于 MyKeyType 类型的对象,因此编译器似乎至少在理论上可以理解我的意思。
有没有办法在 C++ 中做到这一点?
【问题讨论】:
-
您也许可以通过元编程技巧来做一些事情。但是想想当你的键和值类型相同时会发生什么。为什么不使用 typedef 进行实例化? (注意 C++0X 有模板别名,将来可以帮助你。)
-
您可能已经尝试过:如果使用的 KeyCompareFunctor 更频繁地是默认值,则在定义中切换 KeyCompareFunctor 和 ValueCompareFunctor。这样你就可以省略最后一个模板参数。
标签: c++ templates arguments default