Я работаю над реализацией общего указателя. (используя C ++ 17, если это имеет значение)
Единственная проблема - это конструктор преобразования. Я хочу иметь возможность c привести smart_ptr к smart_ptr базового типа.
template<typename U>
inline smart_ptr(const smart_ptr<U>& rhs)
{
...
}
Работает, но также попытается привести smart_ptr к smart_ptr любого другого типа. Например, если у меня есть перегруженная функция, которая может принимать разные типы smart_ptr несвязанного типа, я получаю ошибку компилятора о неоднозначной перегрузке. Итак, я хочу преобразование из smart_ptr -> smart_ptr, только если U является производным классом от T.
Похоже, это должно работать. Он компилируется, но делает наоборот. Он не позволяет работать действительным сообщениям stati c, но все же разрешает приведение к несвязанным типам:
template<typename U>
inline local_shared_ptr(typename enable_if<is_base_of<T,U>::value, const local_shared_ptr<U>&>::type rhs)
{
...
}
РЕДАКТИРОВАТЬ:
Работает, спасибо за помощь. Я выбираю решение Джарода, так как считаю template <typename U, enable_if_t<is_base_of<T,U>::value, int> = 0>
наиболее лаконичным. Я не понимал, что SFINAE может быть таким кратким.
Кроме того, поскольку Натан упомянул об этом:
Как ни странно, одна из проблем, с которыми я столкнулся, заключается в том, что я ожидал, что конструктор копирования шаблона вызываться, когда правая сторона имеет тот же тип. По-видимому, компилятор не считает его реализацией конструктора копирования, а вместо этого вызывается автоматически сгенерированный конструктор копирования. Та же проблема для конструктора перемещения и оператора =. Не уверен, что это ошибка с MSVC2019.