7

C++ では、テンプレート パラメーターがある場合、既定の引数を明確に特殊化するにはどうすればよいですか? たとえば、次のことを考慮してください。

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

Value代わりにfloatfor classをデフォルトにしたい場合はどうすればよいSpecialですか? AssociationKey がSpecialその Value のデフォルトの代わりに になるようにクラスを効果的に特殊化する方法はありますfloatか?

これを行う1つの方法は、特性を使用することだと思います:

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;

それほど複雑ではなく、Association が定義されている場所で int が通常のデフォルトであることをより簡単に示す、より簡潔な方法はありますか?

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 に答える