LINUX.ORG.RU

История изменений

Исправление ox55ff, (текущая версия) :

class Foo [T <: A] //Тип Т является расширением типа A

// с++17
#include <type_traits>

class A {};
class B : public A {};

class C {};

template<typename T,
    typename = std::enable_if_t<
        std::is_base_of_v<A, T>
    >
>
class Foo {};

int main() {
    
    Foo<A> a; // Ок
    Foo<B> b; // Ок
    Foo<C> c; // error: no type named 'type' in 'struct std::enable_if<false, void>'

    return 0;
}

Про неявное приведение надо подумать.

Исправление ox55ff, :

class Foo [T <: A] //Тип Т является расширением типа A

// с++17
#include <type_traits>

class A {};
class B : A {};

class C {};

template<typename T,
    typename = std::enable_if_t<
        std::is_base_of_v<A, T>
    >
>
class Foo {};

int main() {
    
    Foo<A> a; // Ок
    Foo<B> b; // Ок
    Foo<C> c; // error: no type named 'type' in 'struct std::enable_if<false, void>'

    return 0;
}

Про неявное приведение надо подумать.

Исходная версия ox55ff, :

class Foo [T <: A] //Тип Т является расширением типа A

#include <type_traits>

class A {};
class B : A {};

class C {};

template<typename T,
    typename = std::enable_if_t<
        std::is_base_of_v<A, T>
    >
>
class Foo {};

int main() {
    
    Foo<A> a; // Ок
    Foo<B> b; // Ок
    Foo<C> c; // error: no type named 'type' in 'struct std::enable_if<false, void>'

    return 0;
}

Про неявное приведение надо подумать.