I make my list implementation (I will ask without "bicycles", so I want to do this). I want the parameterized type to be necessarily a successor.

class Item { Item& prev; Item& next; }; class SomeClass : Item {...}; class SomeClass2 {...}; template <class T (SHOULD EXTEND ITEM)> List {...}; int main(){ List<SomeClass> list; // Okay List<SomeClass2> list2; // Error [SomeClass2 does not extend Item] } 

    1 answer 1

    You can use static_assert . For example,

     #include <iostream> #include <type_traits> struct Item { Item &next; Item &prev; }; template <typename T> struct List { static_assert( std::is_base_of<Item, T>::value, "Template argument must derive class Item" ); }; struct A : Item {}; struct B {}; int main() { List<A> l1; // List<B> l2; // ошибка компиляции return 0; } 
    • Thanks, it helped. - sashaaero