7

在 C++ 中,如果我有一个模板参数,我怎样才能干净地专门化一个默认参数?例如,考虑以下情况:

template <class Key, class Value = int > class Association;

如果我想Value改为默认为floatfor classSpecial怎么办?有没有一种方法可以有效地专门化该类Association,如果 Key 是SpecialValue 默认为而不是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 的地方的正常默认值?

4

1 回答 1

8

好吧,一个不一定更漂亮的单线:

#include <type_traits>

template <typename Key,
          typename Value = typename std::conditional<std::is_same<Key, Special>::value, float, int>::type>
class Association { /* ... */ };
于 2012-05-25T14:16:36.503 回答