История изменений
Исправление 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;
}
Про неявное приведение надо подумать.