大佬教程收集整理的这篇文章主要介绍了c – 使用std :: optional是否像使用int一样有效?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
// _____________ // | | | // | 2 | 3 | // |_____|_____| // | | | // | 0 | 1 | // |_____|_____| // for each cell,4 children are always stored in row-major order std::vector<std::array<Integer,4>> children;
我知道最大数量的孩子是Integer类型可以表示的值的一个子集.因此,通过使用Integer = int或Integer = unsigned的std :: numeric_limits< unsigned> :: max(),可以识别单元格是否缺少一个小孩.这是std :: optional< Integer>不能假设
据我所知,魔术值的使用是std :: optional的存在理由之一.不过,我担心std :: vector< std :: optional< int>>的性能.在内圈.
所以,
>将会执行std :: vector< std :: optional< int>>比std :: vector< int> (我已经在比较“不存在”的价值).
>或者,可以优化std :: optional的实现来提供与raw int相同的性能吗?如何?
在我的数据结构中,我的函数和魔术值的返回类型混合std :: optional听起来是一个非常糟糕的主意.我更喜欢保持一致,并且使用一个或另一个(至少在同一个上下文中).虽然我可以重载与魔术数字进行比较的功能:
template<T> bool is_valid(const T& t) { return /* comparison with magic value for t */; }
用于可选类型.
只要内部表示完全被用户隐藏,我们认为在公开API公开的数据结构中内部存储不同的值不是错误的.
此外,我建议您将魔术数字隔离成一对内联转换功能.
编译器应该帮助您记住一直使用转换函数,如果您忘记了生成类型错误.您甚至可以在内部数据结构中为int使用精简的struct wrapper,以确保不存在隐式转换(或定义用户定义的转换).
class CompressedoptionalUInt { static const unsigned SENTinEL_MISSING = std::numeric_limits<unsigned>::max(); unsigned value; public: CompressedoptionalUInt(std::optional<unsigned> val) : value(!val? SENTinEL_MISSING: *val) {} operator std::optional<unsigned>() const { ... } };
然后使用std :: array< CompressedoptionalUInt> ;. 把它放在模板中,只需要为每个类型定义哨兵,应该是非常简单的.
以上是大佬教程为你收集整理的c – 使用std :: optional是否像使用int一样有效?全部内容,希望文章能够帮你解决c – 使用std :: optional是否像使用int一样有效?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。