gpt4 book ai didi

c++ - std::any_cast() 和 std::get_if(std::variant) 是否绝对有必要将指针作为参数?

转载 作者:太空狗 更新时间:2023-10-29 20:54:36 24 4
gpt4 key购买 nike

对于 std::anystd::variant 我们有函数来请求关于当前包含值的对象,返回 nullptr 如果无法满足请求(就像 dynamic_cast 一样):

template<class ValueType>
const ValueType *any_cast(const any *operand);

template<class ValueType>
ValueType *any_cast(any *operand);

template <class T, class... Types>
std::add_pointer_t<T> get_if(variant<Types...> *pv);

template <class T, class... Types>
std::add_pointer_t<const T> get_if(const variant<Types...> *pv);

两者都以指针作为参数。为什么?这是没有效率的。该实现每次都检查参数是否不是 nullptrnullptr 参数是否有意义?

此函数可以是类成员或将引用作为参数(名称可能略有不同)。像这样的次优设计的原因是什么?只是模仿 dynamic_cast 接口(interface)?

最佳答案

将函数名称保留为其中之一,并使其像内置的 _cast 一样工作运营商,any_cast使用引用或指针。

指针版本接受一个指针,如果它包含您要求的内容,则返回指向该元素的指针。否则返回 nullptr。

引用版本采用引用,如果它不包含您要求的内容则抛出。

他们使用参数的指针性来区分这两个选项,匹配 dynamic_cast<T&>(x) 的方式。和 dynamic_cast<T*>(&x)工作。

这将很容易内联。针对指向自动存储对象的指针的空值的内联检查很容易优化为“非空”,因为没有一致的方法可以使自动存储对象的地址为 nullptr。

因此,在发布的几乎所有情况下,我都希望 check-if-nullptr 的开销为零。一个异常(exception)是代码有一个指向任何(或变体)的指针,它有一些证据表明这个指向任何的指针不为空,编译器不太可能知道,然后它将它传递给 any_cast。 .如果他们没有使用指针到指示指针返回类型的技巧,人们可能会用 any_cast_to_ptr(any&) 来“冒险”UB。并无条件地解除对指针的引用。

真正缺少的 API 是 dangerous_any_cast ,如果类型不匹配,它只会执行 UB,因为非本地证明了关于 any 状态的知识似乎比非本地证明的知识更有可能关于指向任何指针的无效性。

这种情况很少见。

至于get_if对比get ,不知道为什么没有get_if(variant<???>&)过载。

关于c++ - std::any_cast() 和 std::get_if(std::variant) 是否绝对有必要将指针作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38617907/

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