Шаблонная специализация, где шаблонный тип является также шаблоном

Это изменяет заполнение для всех (x, y, z) меток в одном кадре. Мне больше нравится этот подход:

from matplotlib import rcParams
rcParams['axes.labelpad'] = 20
5
задан Jamie Cook 4 June 2009 в 00:14
поделиться

2 ответа

Не специализируйте шаблон, а перегружайте его. Компилятор определит, какой шаблон функции выбрать, упорядочив их в соответствии со специализацией их типов параметров функций (это называется частичным упорядочением).

template<typename T1, typename T2>
inline string ToString(const std::pair<T1, T2>& x) {
    std::ostringstream o;
    if (!(o << "[" << x.first << "," << x.second << "]"))
        throw BadConversion(string("ToString(pair<T1,T2>)"));
    return o.str();
}

Как правило, частичное упорядочение дает именно то, что вы ожидаете. Более подробно, рассмотрите возможность наличия этих двух функций.

template<typename T> void f(T);
template<typename T, typename U> void f(pair<T, U>);

Теперь, чтобы увидеть, является ли одна из них, по крайней мере, такой же специализированной, как и другая, мы протестируем следующее для обоих шаблонов функций:

  1. выбрали некоторый уникальный тип для каждого параметра шаблона, замените это в список параметров функции.
  2. Используя этот список параметров в качестве аргумента, выполните вычет аргументов в другом шаблоне (сделайте виртуальный вызов с этими аргументами в этот другой шаблон). Если вывод прошел успешно и преобразование не требуется (например, добавление const).

Пример для вышеприведенного:

  1. замена некоторого типа X1 на T дает нам некоторый тип, назовите его X1 . вывод аргумента X1 против пары не будет работать. Так что первый не настолько специализирован, как второй шаблон.
  2. замена типов Y1 и Y2 в пару дает пару . Выполнение вывода аргумента против T первого шаблона работает: T будет выведено как пара . Так что второй по крайней мере так же специализирован, как и первый.

Правило таково, шаблон функции A более специализирован, чем другой шаблон B, если A по крайней мере так же специализирован, как B, но B не по крайней мере так же специализирован, как A. Итак, второй выигрывает в нашем примере: он более специализированный, и он будет выбрано, если мы в принципе можем вызывать обе функции шаблона.

Боюсь, что обзор был на скорую руку, я сделал это только для параметров типа и пропустил некоторые детали. Загляните в 14.5.5.2 в стандартной спецификации C ++, чтобы увидеть кровавые подробности. г

2 в стандартной спецификации C ++, чтобы увидеть кровавые подробности. г

2 в стандартной спецификации C ++, чтобы увидеть кровавые подробности. г

16
ответ дан 18 December 2019 в 09:52
поделиться

Как насчет использования характеристик типов для сериализации различных типов в поток вроде этого:

template<typename T>
struct Traits {
  static inline bool ToStream(std::ostringstream& o, const T& x) {
    return o << x;
  }
};

template<typename T1, typename T2>
struct Traits<std::pair<T1, T2> > {
  static inline bool ToStream(std::ostringstream& o, const std::pair<T1, T2>& x) {
    return o << "[" << x.first << "," << x.second << "]";
  }
};

template<typename T>
inline std::string ToString(const T& x)
{
  std::ostringstream o;
  if (!Traits<T>::ToStream(o, x))
    return "Error";
  return o.str();
}

Примечание: "шаблон <>" из части специализации не является обязательным, код прекрасно компилируется и без него. Вы можете дополнительно добавить методы в свойствах сообщения об исключении.

1
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: