Ответ 1
Можно ли использовать связанный шаблон Reque
, который не имеет нежелательной специализации? В противном случае, я думаю, вам нужно создать оболочку для Cool
, чтобы специализация не использовалась.
Предположим, что я являюсь пользователем определенной библиотеки шаблонов (CTL
), которая определяет шаблон, названный, скажем, Hector
template <class T>
class Hector {...};
И в его документации он дает много гарантий относительно поведения шаблона Hector
.
Но тогда он также определяет специализацию для определенного типа Cool
template <>
class Hector<Cool> {....};
Целью специализации является более оптимизированная реализация Hector
, но, к сожалению, из-за этой оптимизации нарушены многие гарантии Hector
.
В настоящее время мне действительно не нужна оптимизация, я бы предпочел сохранить все гарантии Hector
. Есть ли способ, который я мог бы, не меняя код библиотеки (CTL
- это очень респектабельная библиотека, вы знаете), обойти специализацию? В любом случае? Может быть, написать какую-то упаковку? Что-нибудь? Я просто хочу, чтобы компилятор генерировал код для Hector<Cool>
обычным, неоптимизированным способом со всеми гарантиями.
Можно ли использовать связанный шаблон 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;
};
"my_hector.h"
#include <hector>
на #include "my_hector.h"