Как мой previous question Я пытаюсь построить условия для проверки двух типов проверки, следует ли мне делать dynamic_cast
или нет. я следующие условия:Почему эти условия не должны работать для типов шаблонов?
#define can_dynamic_cast(FROM, TO) \
can_cast(FROM, TO) && \
!std::is_same<FROM, TO>::value && \
std::is_class<TO>::value && \
!std::is_const<FROM>::value && \
std::is_base_of<TO, FROM>::value
Это не работает ниже базовой проверки, то can_dynamic_cast
возвращает истину !!!
static_assert(!can_dynamic_cast(int, int), "didn't expecting dynamic cast, but could!")
Из отчаяния я спустился до нижних условий, но все еще не надеялся!
#define can_dynamic_cast(FROM, TO) \
std::is_convertible<FROM, TO>::value && \
std::is_class<TO>::value && \
std::is_class<FROM>::value
Приведенные выше условия являются наиболее основные условия, can_dynamic_cast
вернутся true
для (int, int)
снова, что не предполагаем !!!
Вопрос
1) Что я не ошибаюсь?
Попробуйте развернуть свой макрос вручную. Подсказка: это '!' Не применяется ко всему выражению. –
@Brian Но тип назначения должен быть указателем/ссылкой на полный тип класса или указатель на cv void. –
@ T.C. Ой, ты прав. Я пропустил это. – Brian