如何使用boost :: optional <t>在C ++中返回NULL?</t>

时间:2011-10-27 14:51:11

标签: c++ boost

我有一个函数需要在某些情况下返回NULL,还有另一个函数需要测试这个函数的返回值。我知道boost :: optional但不确定如何使用语法。

以下是所述用法的简单示例:

int funct1(const string& key) {
  // use iterator to look for key in a map
  if(iterator == map.end()) {
    return NULL // need help here!
  else
    return it->second;
}

void funct2(string key) {
  if(funct1(key) == NULL) { // <-- need help here!
    // do something
  } else {
    // do something else
  }

有人可以帮助解决语法吗?

感谢。

3 个答案:

答案 0 :(得分:14)

在您设置之前,它一直处于“NULL”状态。你可以用这个成语:

optional<int> funct1(const string& key) {
  // use iterator to look for key in a map
  optional<int> ret; 
  if (iterator != map.end()) 
  {
    ret =  it->second;
  }

  return ret;
}

然后:

if (!funct1(key)) { /* no value */ }

答案 1 :(得分:3)

在我提出这个问题之前,请先提一下。

如果始终找到字符串(程序员错误,如果不是),如果不能使用可选项,则应该抛出。即使是用户输入,你甚至可能想要/ catch / throw。

如果你的类模仿容器之类的语义,你应该考虑使用end sentinel来表明它没有被找到,而不是null。

但是,如果返回空表示形式,那么函数返回类型将为boost::optional<int>,空返回值为return boost::none;

答案 2 :(得分:1)

试试这个:

int funct1(const string& key)
{
  // use iterator to look for key in a map
  if(iterator == map.end())
    return boost::optional<int>();
  else
    return boost::optional<int>(it->second);
}

void funct2(string key)
{
  const boost::optional<int> result = funct1(key);
  if (result.is_initialized())
  {
    // Value exists (use result.get() to access it)
  } 
  else
  {
    // Value doesn't exist
  }
}

我还会输入模板,以简化操作:

typedef boost::optional<int> OptionalInt;