Начиная с C ++ 11 существует много признаков свойства типа , которые можно использовать для проверки во время компиляции.
Например std::is_base_of
, который в вашем случае может быть использован как, возможно,
template<typename TChild>
struct IMyInterface
{
static_assert(std::is_base_of<IMyInterface, TChild>::value, "Derived class not derived from IMyInterface");
// ...
};
Примечание. Точный код, показанный выше, не будет работать напрямую, а скорее покажет принцип.
Конечно, это позволяет что-то вроде
class MyFirstClass : public IMyInterface<MyFirstClass>
{
// ...
};
// Note wrong class in template
// vvvvvvvvvvvv
class MySecondClass : public IMyInterface<MyFirstClass>
{
// ...
};
Итак, чтобы ответить на ваш вопрос, если это возможно для такой проверки: не совсем так, как вы хотите. Даже используя другие черты и метапрограммирование, вы никогда не сможете гарантировать, что аргумент шаблона для класса интерфейса является «правильным» при использовании в CRTP .
Единственный способ увидеть, как это работает, - использовать принижение во время выполнения с dynamic_cast
, что-то вроде dynamic_cast<TChild*>(this) != nullptr
в классе интерфейса.