我有两个问题。
第一个关于使用函数。我需要在有条件的情况下尽早突破功能。
例如:
std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec)
{
if (atoi(x.c_str()) < 0)
{
return;
}
else {
std::string concatStr = y + x;
top_back(vec);
top_back(vec);
return concatStr;
}
}
如您所见,该函数必须返回一个字符串,但是如果字符串x(我当然会将其转换为int)小于0,那么从理论上讲,我应该退出该函数。
仅编写return;
的问题是编译器告诉我它需要返回一个值。
第二个问题是如何从控制台中删除最后一行?
这与第一个问题有关,因为有人建议return "";
是一个很好的解决方法,但是它会在控制台中写入一个空格,对于我正在编写的程序来说,这是不好的,并且会导致问题。
答案 0 :(得分:4)
如果可以使用C ++ 17进行编译,则可以使用std::optional
允许您选择从函数中返回某些内容。我们会将您的函数重写为
std::optional<std::string> concat(std::string& x, std::string& y, std::vector<std::string>& vec)
{
if (atoi(x.c_str()) < 0)
{
return {};
}
else
{
std::string concatStr = y + x;
top_back(vec);
top_back(vec);
return concatStr;
}
}
然后在呼叫站点中您可以像使用
auto ret = concat(some, stuff, here)
if(ret) // only print if ret actually holds a string
std::cout << *ret;
或者,您可以使用unique_ptr
并在没有结果的情况下返回空指针。该功能将更改为
std::unique_ptr<std::string> concat(std::string& x, std::string& y, std::vector<std::string>& vec)
{
if (atoi(x.c_str()) < 0)
{
return {};
}
else
{
std::string concatStr = y + x;
top_back(vec);
top_back(vec);
return std::make_unique<std::string>(concatStr);
}
}
但呼叫站点将保持不变。
最后,如果空白字符串永远不会成为函数的有效返回值,则可以将其返回并在调用站点中进行处理,例如
std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec)
{
if (atoi(x.c_str()) < 0)
{
return {};
}
else
{
std::string concatStr = y + x;
top_back(vec);
top_back(vec);
return concatStr;
}
}
int main()
{
//...
auto ret = concat(some, stuff, here)
if(ret != "") // only print if ret actually holds a string
std::cout << ret;
//...
}
答案 1 :(得分:1)
由于您对C ++ 17解决方案不满意,因此可以编写自己的std::optional
实现。
template<typename T>
class Optional
{
bool m_HasValue;
T m_Object;
public:
Optional() : m_HasValue(false){};
Optional(T&& Object) : m_HasValue(true), m_Object(Object){};
operator T&(){return m_Object;}
operator bool(){return m_HasValue;}
T& operator*(){return m_Object;}
};
这是std::optional
的非常简化的版本,但是它将满足您的需求。
其用法与in this post above相同。
using std::string;
Optional<string> DoSomething(string Input)
{
if(Input == "dontprocessme")
return {}
// ... otherwise process the string
string Output;
// blah blah
return Output;
}
// ...
auto RetString = DoSomething("processme");
if(RetString)
std::cout << *RetString;