如何从 return 类型为 pair 的 C++ 函数中 return nullptr 等价物?

How to return nullptr equivalent from a C++ function whose return type is pair?

pair<int, int> findEmpty(int bo[9][9], int n){
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(bo[i][j]==0){
                return (make_pair(i, j));
            }
        }
    }
    //return nullptr; 
}

如果无法返回 nullptr,有什么替代方案?

使用 optional<T> 类型来表示可能不存在的状态。

如果您使用的是 C++17,则可以使用 std::optional<T>,如果您使用 Boost,则 boost::optional<T>,等等。您甚至可以实现自己的 [=14= 版本].重点是使用语义类型来指示可能存在也可能不存在值。

使用 C++17 中的 std::optional,您的代码变为:

optional<pair<int, int>> findEmpty(int bo[9][9], int n){
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(bo[i][j]==0){
                return make_pair(i, j);
            }
        }
    }
    return nullopt; 
}

尽管您可以 通过返回类似哨兵的值(例如一对 (-1, -1))来解决此问题,但不推荐这样做。这会强制检查调用者的特定哨兵值,这些值很容易被遗漏或遗忘——并且可能导致错误的哨兵值进入其他可能永远不会期望负值的算术或间接。

使用语义类型传达可空性有助于防止此类错误。

在C++17及以后的版本中,你可以return一个std::optional,例如:

std::optional<std::pair<int, int>> findEmpty(int bo[9][9], int n){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if (bo[i][j] == 0){
                return std::make_pair(i, j);
            }
        }
    }
    return std::nullopt;
}

auto ret = findEmpty(...);
if (ret)
{
    // use ret.value as needed...
}

或者,您可以 return 一个 pair<bool, pair<int,int>>,其中 bool 表示内部 pair 是否有效:

std::pair<bool, std::pair<int, int> > findEmpty(int bo[9][9], int n){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if (bo[i][j] == 0){
                return std::make_pair(true, std::make_pair(i, j));
            }
        }
    }
    return std::make_pair(false, std::make_pair(-1, -1));
}

std::pair<bool, std::pair<int, int> > ret = findEmpty(...);
if (ret.first)
{
    // use ret.second as needed...
}