#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
другое не указывает на типы без базы. @Someprogrammerdude4. Основная проблема становится яснее. Это действительно проблема, о которой вам следовало бы спросить напрямую (включая обоснование приведения указателя), а затем представить
has_base
концепцию в качестве возможного решения, в реализации которого вам нужна помощь. Возможно, существуют и другие возможные решения этой проблемы.5. @xmllmx: » переинтерпретировать указатели на передачу между объектами базового класса и объектами подкласса опасно » Это не более опасно, чем любая другая переинтерпретация. » вызывается только в том случае, если src_p и dst_p оба не указывают на типы без базы». Я не знаю, что именно вы пытаетесь здесь предотвратить, так как переинтерпретация между несвязанными базовыми типами не менее «опасна» (т. Е. UB), чем переинтерпретация между несвязанными базовыми типами.