Иногда есть способы обойти это.Получите удовольствие от Boost и некоторых шаблонных пакетов метапрограммирования, которые они имеют или используют.В частности, я бы посмотрел на is_base_of для подобных целей в сочетании с частичной специализацией шаблонов.
Например, если вы хотите сделать какую-то магическую хитрость шаблона:
template<typename T, bool Allowed>
struct TemplateVectorCode;
Вы делаете предварительное объявление шаблонного класса.Затем вы создаете специализацию с «истинным» логическим значением:
template<typename T> struct TemplateVectorCode<T, true>{
void operator(const std::vector<T>& myVector) const{ //definition in here }
};
Наконец, вы используете это с is_base_of
, чтобы только создавать экземпляры вашего функтора шаблона следующим образом:
template<typename T, typename Base>
struct MyFunction : TemplateVectorCode<T, boost::is_base_of<Base,T>::value>{
};
Важно отметить, что, поскольку мы не определили TemplateVectorCode<T, false>
, компилятор выдаст ошибку компиляции, если вы попытаетесь использовать функтор с типом класса T
, который не является производным от типа V
.Это означает, что вы можете работать с одним и тем же кодом в одном месте без необходимости писать несколько версий.
(если я облажался с частичной специализацией шаблона, кто-то, пожалуйста, отредактируйте его. Мне нужно лечь спать).