Если вы можете скомпилировать с использованием 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;
//...
}