Обход шаблонной специализации
Предположим, я пользователь определенной библиотеки шаблонов (CTL
), который определяет шаблон, названный, скажем, Hector
template <class T>
class Hector {...};
И в своей документации он дает много гарантий о Hector
Поведение шаблона. Но тогда это также определяет специализацию для определенного типа Cool
template <>
class Hector<Cool> {....};
Целью специализации является более оптимизированная реализация Hector
но к сожалению из-за этой оптимизации много гарантий Hector
нарушены.
В настоящее время мне действительно не нужна оптимизация, я бы предпочел сохранить все гарантии Hector
, Есть ли способ, которым я мог, не изменяя код библиотеки (CTL
это очень уважаемая библиотека, знаете ли), обойти специализацию? Как-нибудь вообще? Может, напишите какую-нибудь обертку? Что-нибудь? Я просто хочу, чтобы компилятор генерировал код для Hector<Cool>
нормальным, неоптимизированным способом, со всеми гарантиями.
5 ответов
Вы можете использовать соответствующий шаблон Reque
что не имеет нежелательной специализации? В противном случае я думаю, что вам нужно создать оболочку для Cool
так что специализация не используется.
Вы могли бы круто обернуться в фиктивный тип, чтобы шаблон не специализировался на нем.
Нет. И даже если это можно сделать каким-то эзотерическим способом, не надо. Обходящие языковые особенности должны вызывать тревогу.
Вы должны обернуть значение или использовать другой тип, как char
вместо bool
(они ведут себя одинаково), давая std::vector<char>
вместо std::vector<bool>
,
Вот немного общего маскировки:
template <typename T>
struct Drool
{
Drool(T d) : b(d) { }
inline operator T() const { return b; }
inline Drool<T> & operator=(T d) { b = d; return *this; }
private:
T b;
};
Теперь вы можете сказать Hector<Drool<Cool>>
,
Улучшенная версия в соответствии с Xeo:
template <typename T>
struct Drool
{
Drool(const T & d) : b(d) { }
Drool(Drool && o) = default;
inline operator const T & () const { return b; }
inline operator T & () { return b; }
private:
T b;
};
- Откройте
стандартнуюреализацию - Ctrl+A
- Ctrl+C
- Создайте новый файл с именем
"my_hector.h"
- Ctrl+V
- Удалить специализацию
- Поиск и замена
#include <hector>
с#include "my_hector.h"
[Редактировать для @Xeo;-) ] - Переименуйте идентификаторы, которые начинаются с двух начальных подчеркиваний, за которыми следует строчная буква, а все идентификаторы, которые начинаются с одного начального подчеркивания, следуют за заглавной буквой.