Я разрабатываю приложение для встроенного устройства, поэтому у меня нет type_traits
и enable_if
(плохое качество компилятора). Я создал их сам по себе:C++ enable_if в классе - разные способы уничтожения
template <typename T>
struct is_pointer_t{
enum{value = false};
};
template <typename T>
struct is_pointer_t<T*>{
enum{value = true};
};
и объявления для всего напоминает consts
и volatiles
.
Сейчас реализация enable_if
:
template <bool boolean, typename T = void>
struct enable_if{};
template <typename T>
struct enable_if<true, T>{
typedef T type;
};
Теперь я хочу иметь класс, который depeneding на погоду я использую указатели или обычные типы он вызывает деструктор на них или нет, так что было бы здорово, если бы я мог имеют шаблонный деструктор. Но я не знаю, как это сделать, поскольку я только начинаю разрабатывать шаблоны. Не удалось выполнить следующие попытки:
template <typename T>
class pointerOrNot{
public:
template <typename U>
void one();
};
template <typename T>
template <typename enable_if<is_pointer_t<T>::value>::type>
void pointerOrNot<T>::one(){
std::cout << "Success1" << std::endl;
}
template <typename T>
template <typename enable_if<!is_pointer_t<T>::value>::type>
void pointerOrNot<T>::one(){
std::cout << "Success2" << std::endl;
}
, и он говорит, что не соответствует определению. Поэтому я пробовал:
template <typename T>
class pointerOrNot{
public:
template <typename enable_if<is_pointer_t<T>::value>::type>
void one();
template <typename enable_if<!is_pointer_t<T>::value>::type>
void one();
};
Но тогда один из одного() имеет пустой тип в качестве шаблона и компиляция не удалась. Как я могу это сделать? Также можно сделать это с помощью деструктора?
Вместо выбор по политике уничтожения, я бы просто не принял никаких исходных указателей из-за проблемы собственности. Вы все равно можете использовать необработанные указатели, завернутые в объекты интеллектуального указателя, которые уничтожают или нет, в качестве выбора кода клиента. Нетрудно определить умный указатель, и это один из хороших способов полностью разделить проблемы **. –
Если вам действительно нужен выбор по типу указателя против не указателя, тогда вы можете использовать шаблон вспомогательной функции, специализированный для is и is-not. Вы также можете использовать так называемый «основанный на политике дизайн», который по существу состоит в том, чтобы иметь шаблон P в качестве параметра шаблона, где P создается посредством, например, ваш Т и обеспечивает, например, уничтожение работа. Но вы получаете гораздо более простое и чистое разделение проблем с умными указателями. –
Для «В моем скромном мнении» гораздо более читаемая альтернатива «enable_if», которую я называю просто «If_», см. (Https://github.com/alf-p-steinbach/cppx/blob/plutonium/core_language_support/tmp/ If_.hpp). –