C ++在早期就突破了功能

时间:2018-06-29 21:01:19

标签: c++ c++11 stl

我有两个问题。

第一个关于使用函数。我需要在有条件的情况下尽早突破功能。

例如:

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 ""; 是一个很好的解决方法,但是它会在控制台中写入一个空格,对于我正在编写的程序来说,这是不好的,并且会导致问题。

2 个答案:

答案 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;