1

I'm trying to to 'overload' template function in class, depending on specialisation argument's parent template class - but it is not working(error C2938: 'std::enable_if_t<false,bool>' : Failed to specialize alias template). What is wrong here? Here is the full code:

#include <memory>
#include <type_traits>

template <template <typename...> class BaseTemplate, typename Derived, typename TCheck = void>
struct test_base_template;

template <template <typename...> class BaseTemplate, typename Derived>
using is_base_template_of = typename test_base_template<BaseTemplate, Derived>::is_base;

//Derive - is a class. Let inherit from Derive, so it can cast to its protected parents
template <template <typename...> class BaseTemplate, typename Derived>
struct test_base_template<BaseTemplate, Derived, std::enable_if_t<std::is_class_v<Derived>>> : Derived
{
    template<typename...T>
    static constexpr std::true_type test(BaseTemplate<T...>*);
    static constexpr std::false_type test(...);
    using is_base = decltype(test((test_base_template*) nullptr));
};

//Derive - is not a class, so it always false
template <template <typename...> class BaseTemplate, typename Derived>
struct test_base_template<BaseTemplate, Derived, std::enable_if_t<!std::is_class_v<Derived>>>
{
    using is_base = std::false_type;
};

template<typename type>
class MyClass
{
public:
    template <typename Dummy = type, typename std::enable_if_t<is_base_template_of<std::weak_ptr, type>::value, bool> = bool()>
    std::shared_ptr<typename type::element_type> get()
    {
        return m_data.lock();
    }

    template <typename Dummy = type, typename std::enable_if_t<is_base_template_of<std::shared_ptr, type>::value, bool> = bool()>
    std::shared_ptr<typename type::element_type> get()
    {
        return m_data;
    }

private:
    type m_data;
};

int main()
{
    MyClass<std::weak_ptr<int>> t;
    auto a1 = t.get();

    MyClass<std::shared_ptr<int>> t2;
    auto a2 = t2.get();
}

Readed this thread std::is_base_of for template classes

0 Answers0