gpt4 book ai didi

c++ - 为什么这些条件不适用于模板类型?

转载 作者:太空宇宙 更新时间:2023-11-04 13:36:29 24 4
gpt4 key购买 nike

作为我的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 将返回 true!!!

 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会再次为(int, int)返回true,这不是假设!!!

问题

1) 我没看错什么?

最佳答案

总结一下评论中给出的解决方案和答案:(感谢T.C.和AntonSavin)

你的宏不是完全错误的,但它是一个宏。预处理器简单地用宏的内容替换宏调用:

 static_assert(!can_dynamic_cast(int, int), "...");
// =>
static_assert(!std::is_convertible<int, int>::value &&
std::is_class<int>::value &&
std::is_class<int>::value , "...");

因此,只有第一个值被取反,这会产生意想不到的行为。

要解决这个问题,您必须在宏定义或宏调用中添加方括号:

#define can_dynamic_cast(FROM, TO) \
( std::is_convertible<FROM, TO>::value && \
std::is_class<TO>::value && \
std::is_class<FROM>::value )
// or

static_assert(!(can_dynamic_cast(int, int)), "...");

一个更好的解决方案,而不是更长的解决方案是创建一个自己的类型特征类:

template <class FROM, class TO>
struct can_dynamic_cast : std::integral_constant< bool,
std::is_convertible<FROM, TO>::value &&
std::is_class<TO>::value &&
std::is_class<FROM>::value > {};

static_assert(!can_dynamic_cast<int, int>::value, "...");

它不太容易出错,因为它在元函数调用中遵循 c++ 语法并且不需要额外的括号。

关于c++ - 为什么这些条件不适用于模板类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29375016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com