2014-10-24 4 views
3

Я бы хотел специализировать default_delete < _Ty> для всех объектов, выведенных из MyBaseClass. Это была моя лучшая попытка:Частичная специализация для default_delete

template <typename T> 
struct default_delete<typename enable_if<is_base_of<MyBaseClass, T>::value, T>::true_type> 
{ 
    ... 
}; 

Компилятор, кажется, не в состоянии признать, что мой тип параметра «T» используется, что вполне понятно, учитывая, что она является «вниз по течению» от «TYPENAME» ключевое слово. Это то, что я пытаюсь сделать возможным?

+0

Пожалуйста, разместите ошибку, которую вы получаете (и желательно, минимальный пример, показывающий ошибку). – Oguk

+1

Объявление параметра - это необоснованный контекст (т. Е. 'T' не может быть выведен из заданного параметра). 'default_delete' должен иметь дополнительный параметр, который позволяет выражать выражения типа SFINAE, иначе это невозможно (AFAIK). В качестве альтернативы вы можете реализовать свой собственный дебит. – 0x499602D2

+0

Не должно быть 'enable_if :: value, T> :: type'? – Pradhan

ответ

3

Как указано в комментарии 0x499602D2, это невозможно без специального параметра шаблона. вы можете использовать свой собственный деактивировать следующим образом:

template <typename T, typename Enable = void> 
struct my_default_delete : public std::default_delete<T> {}; // default to std::default_delete<T> 

template <typename T> 
struct my_default_delete<T, typename std::enable_if<std::is_base_of<MyBaseClass, T>::value>::type> 
{ 
    void operator() (T*) { /* Your specific implementation */ } 
}; 
+0

Проблема в том, что делетер больше не является дефолтом по умолчанию. т.е. мне нужно будет указать этот деактивировать вручную так: unique_ptr > – yxrkt

+0

@yxrkt: вы можете добавить дополнительный слой: 'template > using my_unique_ptr = std :: unique_ptr ; ' – Jarod42

+0

Шаблон aliasing был бы потрясающим, но наш проект использует vs2012 :( – yxrkt

Смежные вопросы