我有一个函数需要在某些情况下返回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
}
有人可以帮助解决语法吗?
感谢。
答案 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;