Короткий вопрос
Как я могу проверить во время компиляции, если шаблон класса ( edit: не создан) наследуется от своего первого параметра шаблона начиная с C ++ 17?
Длинный вопрос
Я хочу выяснить, наследует ли шаблон класса от своего (первого) параметра шаблона, построив что-то вроде:
template<template<typename> class TemplateClass>
struct template_parameter_is_base_of
{
/* Implementation */
};
В идеале, template_parameter_is_base_of
можно использовать так:
template<typename T> struct WithParent : T { /* Implementation */ };
template<typename T> struct WoutParent : { /* Implementation */ };
static_assert(template_parameter_is_base_of<WithParent>::value); // Ok as expected since WithParent inherits from T
static_assert(template_parameter_is_base_of<WoutParent>::value); // Error as expected since WithParent doesn't inherit from T
Моя неудачная попытка
Моя попытка реализовать template_parameter_is_base_of
:
struct Dummy {};
template<template<typename> class TemplateClass>
struct template_parameter_is_base_of
{
static constexpr bool value = std::is_base_of_v<Dummy, TemplateClass<Dummy>>;
};
..., которая работает в этом случае:
template<typename T>
struct A : T {
void work() { /* Irrelevant implementation */ }
};
static_assert(template_parameter_is_base_of<A>::value); // Passes because A inherits from its template parameter. Nice!
... но происходит сбой, если шаблон класса имеет метод со спецификатором override
:
template<typename T>
struct B : T {
void work() override { /* Irrelevant implementation */ }
};
static_assert(template_parameter_is_base_of<B>::value); // Fails, but I want it to pass because B inherits from its template parameter.
Это то, что я думаю прямо сейчас
Я думаю, что загнал себя в угол с использованием подхода Dummy
, использованного выше, поскольку создание экземпляра шаблона класса TemplateClass<Dummy>
в std::is_base_of_v
всегда будет неудачным, если TemplateClass
содержит какие-либо методы со спецификатором override
.
Однако я думаю, что реализация template_parameter_is_base_of
должна быть возможной bпотому что компилятор должен знать во время компиляции, наследует ли шаблон класса от своего параметра шаблона или нет. Может быть, я ошибаюсь.
Наконец, вопрос
Возможно ли реализовать template_parameter_is_base_of
на C ++ 17? Если да, как это можно сделать?