- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于 std::any
和 std::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);
两者都以指针作为参数。为什么?这是没有效率的。该实现每次都检查参数是否不是 nullptr
。 nullptr
参数是否有意义?
此函数可以是类成员或将引用作为参数(名称可能略有不同)。像这样的次优设计的原因是什么?只是模仿 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/
我正在使用 this solution在二进制矩阵中找到与图像边界对齐的矩形。假设现在我想找到一个不与图像边框对齐的矩形,并且我不知道它的方向;找到它的最快方法是什么? 为了示例,让我们寻找一个仅包含
else: 行在这个 Python 程序中是否正确/必要? from random import randrange for n in range(10): r = randrange(0,1
在 TDPL 7.1.5.1 中讨论了将 Widget w2 分配给 w1 并且作者指出“将 w2 逐个字段分配给 w1 会将 w2.array 分配给 w1.array——一个简单的数组边界分配,而
我是一名优秀的程序员,十分优秀!