Я пытаюсь реализовать структуру, которая проверяет во время компиляции, является ли данный тип интеллектуальным указателем или ссылкой на интеллектуальный указатель.
Я переписал это решение (которое делает не работает для ссылок):
template<typename T, typename Enable = void>
struct IsSmartPointer : std::false_type {
};
template<typename T>
struct IsSmartPointer<T,
typename std::enable_if<
std::is_same<
typename std::decay_t<T>, std::unique_ptr<typename std::decay_t<T>::element_type>
>::value
>
> : std::true_type {
};
template<typename T>
struct IsSmartPointer<T,
typename std::enable_if<
std::is_same<
typename std::decay_t<T>, std::shared_ptr<typename std::decay_t<T>::element_type>
>::value
>
> : std::true_type {
};
template<typename T>
struct IsSmartPointer<T,
typename std::enable_if<
std::is_same<
typename std::decay_t<T>, std::weak_ptr<typename std::decay_t<T>::element_type>
>::value
>
> : std::true_type {
};
Я чувствую, что эта реализация очень близка к правильному решению. Однако приведенный ниже код печатает нули:
std::cout << IsSmartPointer<int>::value << '\n'
<< IsSmartPointer<const std::shared_ptr<int> &>::value << '\n'
<< IsSmartPointer<std::shared_ptr<int> &>::value << '\n'
<< IsSmartPointer<const std::shared_ptr<int>>::value << '\n'
<< IsSmartPointer<std::shared_ptr<int>>::value
<< std::endl;
Не могли бы вы попытаться найти ошибку, потому что у меня закончились идеи?