代码之家  ›  专栏  ›  技术社区  ›  HostileFork says dont trust SE

修改not_null以禁止与nullptr进行比较

  •  1
  • HostileFork says dont trust SE  · 技术社区  · 6 年前

    (特别是因为这是代码历史上一直在使用的内容。)

    我发现人们已经解决了这个问题 not_null part of the C++ Core Guidelines ,听起来很有希望。下面是一个麻省理工学院许可的微软实现:

    https://github.com/Microsoft/GSL/blob/5cbde3008aa43a9c5f6c219ee15b8388336d4433/include/gsl/pointers#L55

    #include <iostream>
    #include "include/gsl/gsl"
    
    int main() {
        int i;
        gsl::not_null<int*> ptr (&i);
        /* gsl::not_null<int*> ptr_error (nullptr); */ // this errors
    
        if (ptr != nullptr)
           std::cout << "No compile error on compare--this prints\n";
    }
    

    真不幸。:-/

    1. 什么是一个好的小编辑 将其更改为不允许进行这些比较,例如。 nullptr == ptr , ptr == nullptr = delete; 一些重载到==和!=直到它在我想要的情况下给出错误,但我希望使用预先编写的代码,有人会考虑到这一点,并做得更为“正确”。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Vivick    6 年前

    您可以这样做的原因之一可能是,有时您可能会得到一个指针/智能指针,并希望将其与 gsl::not_null gsl::不为空 在一个模板函数中(它绝对不知道 gsl::不为空

    template<class Lhs, class Rhs>
    bool hasSameValue(Lhs lhs, Rhs rhs){
      if(lhs == nullptr || rhs == nullptr)
        return lhs == rhs;
    
      return *lhs == *rhs;
    }
    
    gsl::not_null<int*> ptr = /* [...] */;
    shared_ptr<int> sptr = /* [...] */;
    hasSameValue(ptr, sptr);
    

    如果你还想拒绝支票/ nullptr

    bool operator==(std::nullptr_t nptr) = delete;
    bool operator!=(std::nullptr_t nptr) = delete;
    

    将它们标记为已删除就足够了。请注意 不能从定义它们的类继承。如果它继承自定义它们的类,只需抛出一个异常(即使它只是一个运行时错误)。

        2
  •  0
  •   Alan Birtles    6 年前

    您只需要为 std::nullptr_t

    // Example program
    #include <iostream>
    #include <string>
    
    class Test
    {
    public:
      Test(int value) : value(value) {}
    
      bool operator == (std::nullptr_t n)
      {
          return value == 0;
      }
    
      bool operator != (std::nullptr_t n)
      {
          return value != 0;
      }
    
    private:
      int value;    
    };
    
    int main()
    {
        Test a(0);
        Test b(1);
        std::cout << (a == nullptr) << ", " << (b == nullptr) << "\n";
        std::cout << (a != nullptr) << ", " << (b != nullptr) << "\n";
    }
    

    或者,如果您想要编译错误,只需删除相同的运算符。