Обход шаблонной специализации

Предположим, я пользователь определенной библиотеки шаблонов (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;
};
  1. Откройте стандартную реализацию
  2. Ctrl+A
  3. Ctrl+C
  4. Создайте новый файл с именем "my_hector.h"
  5. Ctrl+V
  6. Удалить специализацию
  7. Поиск и замена #include <hector> с #include "my_hector.h"
    [Редактировать для @Xeo;-) ]
  8. Переименуйте идентификаторы, которые начинаются с двух начальных подчеркиваний, за которыми следует строчная буква, а все идентификаторы, которые начинаются с одного начального подчеркивания, следуют за заглавной буквой.
Другие вопросы по тегам