Подтвердить что ты не робот

Специализация шаблона

Предположим, что я являюсь пользователем определенной библиотеки шаблонов (CTL), которая определяет шаблон, названный, скажем, Hector

template <class T>
class Hector {...};

И в его документации он дает много гарантий относительно поведения шаблона Hector. Но тогда он также определяет специализацию для определенного типа Cool

template <>
class Hector<Cool> {....};

Целью специализации является более оптимизированная реализация Hector, но, к сожалению, из-за этой оптимизации нарушены многие гарантии Hector.

В настоящее время мне действительно не нужна оптимизация, я бы предпочел сохранить все гарантии Hector. Есть ли способ, который я мог бы, не меняя код библиотеки (CTL - это очень респектабельная библиотека, вы знаете), обойти специализацию? В любом случае? Может быть, написать какую-то упаковку? Что-нибудь? Я просто хочу, чтобы компилятор генерировал код для Hector<Cool> обычным, неоптимизированным способом со всеми гарантиями.

4b9b3361

Ответ 1

Можно ли использовать связанный шаблон Reque, который не имеет нежелательной специализации? В противном случае, я думаю, вам нужно создать оболочку для Cool, чтобы специализация не использовалась.

Ответ 2

Вы можете обернуть классный тип, чтобы предотвратить его специализированный шаблон.

Ответ 3

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

Вам нужно обернуть значение или использовать другой тип типа char вместо bool (они ведут себя аналогично), давая std::vector<char> вместо std::vector<bool>.

Ответ 4

Вот небольшой общий скил:

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;
};

Ответ 5

  • Откройте стандартную определенную реализацию
  • Ctrl + A
  • Ctrl + C
  • Создайте новый файл с именем "my_hector.h"
  • Ctrl + V
  • Удалить специализацию
  • Найдите и замените #include <hector> на #include "my_hector.h"
    [Изменить для @Xeo;-)]
  • Переименовать идентификаторы, начинающиеся с двух ведущих подчеркиваний, за которыми следуют строчные буквы, и все идентификаторы, начинающиеся с одного верхнего подчеркивания, следующего за строчной буквой.