Какой существует способ гарантировать обязательную проверку в каждой реализации класса?
Есть класс - многоугольник
template <class Selector>
class NGon;
Есть несколько селекторов:
struct _3selector{};
struct _4selector{};
И, соответственно, столько же реализаций класса NGon:
template <>
class NGon<_3selector> {/* очень полезный треугольник */};
template <>
class NGon<_4selector> {/* очень полезный четырехугольник */};
Я хочу, чтобы при создании очередной реализации происходила проверка того, что класс наследуется, например, от
class INGon {};
То есть, в следующем случае должна быть ошибка компиляции, так как NGon<_5selector> не наследуется от INGon
struct _5selector{};
template <>
class NGon<_5selector> {/* очень полезный пятиугольник */}; // ошибка компиляции: Я упаль :(
А в случае, когда наследование есть, ошибок быть не должно
struct _6selector{};
template <>
class NGon<_6selector> : INGon {/* очень полезный шестиугольник*/}; // ошибок компиляции нет
Как это можно реализовать?