是否可以在C ++中编写SafeNavigation运算符

时间:2014-03-07 10:51:32

标签: c++ c++11 operators

在我阅读有关SafeNavigator operator introduction in C#

的文章时

我想知道是否可以使用C ++编写那种运算符?例如,简单地写:

auto a = node->child()->child();
if( a != nullptr)
{ ... }

而不是像:

if( node != nullptr && node->child() != nullptr && (auto a = node->child()->child()) != nullptr)
{ ... }

1 个答案:

答案 0 :(得分:0)

我看到两种方法:

1)首先,通过检查空实例上的调用,“ 实际上工作的非标准行为”:

class   node
{
public:
  node()
    :
    child_(nullptr)
  {
  }

  ...

  node* child()
  {
    if (this == nullptr)
      {
        return nullptr;
      }
    return child_;
  }

  ...

private:
  node  *child_;
};

2)其次,采用几乎相同的原则应用Null Object Pattern的“标准友好方式”:

class   node
{
public:
  node()
    :
    is_null_(false),
    child_(nullptr)
  {
  }

  node(nullptr_t)
    :
    is_null_(true),
    child_(nullptr)
  {
  }


  ...

  node* child()
  {
    if ((is_null_) || (child_ == nullptr))
      {
        return new node(nullptr);;
      }
    return child_;
  }

  bool  operator!=(nullptr_t)
  {
     return (!is_null_);
  }

  bool  operator==(nullptr_t)
  {
     return (is_null_);
  }


  ...

private:
  bool  is_null_;
  node  *child_;
};