Это изменяет заполнение для всех (x, y, z) меток в одном кадре. Мне больше нравится этот подход:
from matplotlib import rcParams
rcParams['axes.labelpad'] = 20
Не специализируйте шаблон, а перегружайте его. Компилятор определит, какой шаблон функции выбрать, упорядочив их в соответствии со специализацией их типов параметров функций (это называется частичным упорядочением).
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>);
Теперь, чтобы увидеть, является ли одна из них, по крайней мере, такой же специализированной, как и другая, мы протестируем следующее для обоих шаблонов функций:
Пример для вышеприведенного:
X1
на T
дает нам некоторый тип, назовите его X1
. вывод аргумента X1
против пары
не будет работать. Так что первый не настолько специализирован, как второй шаблон. Y1
и Y2
в пару
дает пару
. Выполнение вывода аргумента против T
первого шаблона работает: T
будет выведено как пара
. Так что второй по крайней мере так же специализирован, как и первый. Правило таково, шаблон функции A более специализирован, чем другой шаблон B, если A по крайней мере так же специализирован, как B, но B не по крайней мере так же специализирован, как A. Итак, второй выигрывает в нашем примере: он более специализированный, и он будет выбрано, если мы в принципе можем вызывать обе функции шаблона.
Боюсь, что обзор был на скорую руку, я сделал это только для параметров типа и пропустил некоторые детали. Загляните в 14.5.5.2
в стандартной спецификации C ++, чтобы увидеть кровавые подробности. г
Как насчет использования характеристик типов для сериализации различных типов в поток вроде этого:
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();
}
Примечание: "шаблон <>" из части специализации не является обязательным, код прекрасно компилируется и без него. Вы можете дополнительно добавить методы в свойствах сообщения об исключении.