Как использовать концепцию c для определения того, имеет ли класс базу или нет?

#c #c 20 #typetraits #c -concepts #compile-time-type-checking

Вопрос:

 template<typename T>
concept has_base = ???; // What code should be put here?

struct A
{};

struct B : A
{};

int main()
{
    static_assert(has_base<A> == false);    
    static_assert(has_base<B> == true);
}
 

Есть ли способ определить, имеет ли класс базу или нет?

Комментарии:

1. Каков вариант использования для этого? Существует множество классов, в которых базовый класс используется в качестве детали реализации, так что для ваших нужд может быть лучшая черта.

2. Но они все равно могут использоваться как «чистая структура C» и передаваться без изменений в функцию C. Что вы должны делать с этой структурой? Почему он не может использовать наследование? Является ли файл, в котором вы определяете структуру, которая должна использоваться (т. Е. включаться) в проект C? Тогда почему бы не использовать компилятор C в качестве проверки определения структуры?

3. Я хочу написать my_cast<dst_p>(src_p) функцию, вызываемую только в том случае, если src_p и то, и dst_p другое не указывает на типы без базы. @Someprogrammerdude

4. Основная проблема становится яснее. Это действительно проблема, о которой вам следовало бы спросить напрямую (включая обоснование приведения указателя), а затем представить has_base концепцию в качестве возможного решения, в реализации которого вам нужна помощь. Возможно, существуют и другие возможные решения этой проблемы.

5. @xmllmx: » переинтерпретировать указатели на передачу между объектами базового класса и объектами подкласса опасно » Это не более опасно, чем любая другая переинтерпретация. » вызывается только в том случае, если src_p и dst_p оба не указывают на типы без базы». Я не знаю, что именно вы пытаетесь здесь предотвратить, так как переинтерпретация между несвязанными базовыми типами не менее «опасна» (т. Е. UB), чем переинтерпретация между несвязанными базовыми типами.