Расширение пространства имен std посредством частичной специализации шаблона
Насколько я знаю, нам разрешено (за некоторыми исключениями, которые я не буду здесь упоминать) "расширять" namespace std
полностью специализируясь std
функция шаблона, такая как std::swap
т.е.
namespace std
{
template<>
void swap<Foo>(Foo& lhs, Foo& rhs){...}
}
совершенно верно.
Начиная с C++11, теперь мы можем частично специализировать функции. Я считаю, что тогда мы можем играть в ту же игру и расширить std
через частичную специализацию, например
namespace std
{
template<typename T>
void swap<Foo<T>>(Foo<T>& lhs, Foo<T>& rhs){...}
}
однако я не уверен в этом и не смог найти соответствующий поясняющий раздел в стандарте. Правильно ли указан код выше или он ведет к UB?
PS: Как отметил @Columbo в ответе, мы не можем частично специализировать шаблоны функций, даже в C++11/14. По какой-то причине я думал, что это можно сделать, я полагал, что это было по крайней мере предложение.
1 ответ
Вы можете иметь в виду [namespace.std]/1:
Программа может добавить специализацию шаблона для любого стандартного шаблона библиотеки в пространство имен
std
только если объявление зависит от определяемого пользователем типа, а специализация соответствует стандартным требованиям библиотеки для исходного шаблона и явно не запрещена 181.181) Любой библиотечный код, который создает экземпляры других библиотечных шаблонов, должен быть подготовлен для адекватной работы с любой предоставленной пользователем специализацией, которая соответствует минимальным требованиям стандарта.
Если частичные специализации шаблонов функций когда-либо вводятся, эта цитата также неявно охватывает их (поскольку она не ограничивается явной специализацией).