在c 11中实现boost :: optional

前端之家收集整理的这篇文章主要介绍了在c 11中实现boost :: optional前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用c 11功能实现boost :: optional之类的数据结构.这是我到目前为止:
  1. template<typename T>
  2. struct maybe {
  3. bool valid;
  4.  
  5. union {
  6. T value;
  7. };
  8.  
  9. maybe() : valid(false) {}
  10. maybe(const T& _v) {
  11. valid = true;
  12. new (&value) T(_v);
  13. }
  14. maybe(const maybe& other) {
  15. if (other.valid) {
  16. valid = true;
  17. new (&value) T(other.value);
  18. }
  19. else valid = false;
  20. }
  21.  
  22. ~maybe() {
  23. if (valid)
  24. value.~T();
  25. }
  26.  
  27. bool is_valid() { return valid; }
  28.  
  29. operator T&() {
  30. if (valid) return value;
  31. throw std::bad_exception();
  32. }
  33. };

我利用无限制联合功能为可选值创建一个正确对齐的空间,该空间可以原位存储,而不是动态分配空间.事情很有效,除非我想创建一个可能的<>有参考.例如,可能< int&>导致g 4.7抱怨:

  1. error: maybe<int&>::<anonymous union>::value may not have reference type int&’
  2. because it is a member of a union

我该怎么做才能制作类商店参考?我们也欢迎任何其他改进/建议.

解决方法

要使这个工作与引用一起使用,你肯定需要一个显式的特化,因为你不能做一个新的引用:你需要使用指针存储.

除此之外,代码缺少一个复制赋值运算符.移动构造函数和移动赋值运算符也会很好(特别是因为这是重新实现boost :: optional的第一个原因:boost中的那个缺少它们).

猜你在找的C&C++相关文章