在C ++中,如果我有一个模板参数,我该如何干净地专门化一个默认参数?例如,请考虑以下事项:
template <class Key, class Value = int > class Association;
如果我希望Value
默认为float
类Special
,该怎么办?有没有办法实际上专门化类Association
,以便如果Key为Special
,那么Value默认为float
?
我想有一种方法可以做到这一点:
template <class Key> struct Traits {
typedef int defaultValue;
}
template<> struct Traits<Special> {
typedef float defaultValue;
}
template <class Key, class Value = Traits<Key>::defaultValue> class Association;
是否有一种更为简洁的方式可以做到这一点并没有那么复杂,并且更容易证明int是定义Association的地方的正常默认值?
答案 0 :(得分:8)
嗯,一个不那么漂亮的单线:
#include <type_traits>
template <typename Key,
typename Value = typename std::conditional<std::is_same<Key, Special>::value, float, int>::type>
class Association { /* ... */ };