Может ли аргумент по умолчанию параметра шаблона быть специализированным?

В C++, если у меня есть параметр шаблона, как я могу четко специализировать аргумент по умолчанию? Например, рассмотрим следующее:

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

Что, если я хочу, чтобы вместо Value по умолчанию использовалось значение float для класса Special? Есть ли способ фактически специализировать класс Association таким образом, чтобы, если ключ равен Special, значение по умолчанию вместо этого было 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 является нормальным значением по умолчанию в месте, где определена ассоциация?


person WilliamKF    schedule 25.05.2012    source источник
comment
Я считаю, что должен быть способ добиться того, чего вы хотите, с помощью псевдонимов шаблонов (using), но у меня нет времени разбираться с этим.   -  person sehe    schedule 25.05.2012


Ответы (1)


Ну, не обязательно красивая строчка:

#include <type_traits>

template <typename Key,
          typename Value = typename std::conditional<std::is_same<Key, Special>::value, float, int>::type>
class Association { /* ... */ };
person Kerrek SB    schedule 25.05.2012