簡體   English   中英

一個 function 可以有兩種不同的返回類型嗎?

[英]Can one function have two different return types?

所以今天在測試中,我們有一個代碼,我們有 output 的代碼,我們需要編寫 function。

std::vector<double> v;
auto z = first(v);
std::cout << z << std::endl;  // OUTPUT: No value!
v.push_back(3.14);
z = first(v);
std::cout << z << std::endl;  // OUTPUT: 3.14

我們需要編寫的 Function 是first() 它接受任何類型的vector作為參數,並返回vector的第一個元素(如果vector不為空)。

我是這樣做的:

template <typename T>
std::string first(const std::vector<T>& ve){
    if(ve.empty())
        return "No value!";
    else
        return std::to_string(*(ve.begin()));
}

當我問我的老師to_string()怎么走時,因為我不知道to_string()的名字是什么,他說我不需要它,因為auto z = first(v)不應該是一個字符串。

我應該如何獲得 output No value! 如果first()不返回字符串?

一個 function 可以有兩種不同的返回類型嗎?

不。

但是,function 可以返回 sum 類型。 總和類型是一種以上類型的包裝器。 標准庫有例如std::variant可以包裝集合中的任何類型。 這是一個標記的聯盟。 另一種您可能會發現有用的求和類型是std::optional ,它可以包含某種類型的值,也可以不包含。

現在,標准字符流不知道如何打印一個可選的,為此定義一個運算符並不是一個好主意。 因此,如果我們必須為完全顯示的程序提供完全描述的行為,那么我們應該自己定義求和類型。 最好還是委托給標准庫:

struct printable_optional {
    std::optional<double> opt;
    friend std::ostream&
    operator<<(std::ostream& os, const printable_optional& po) {
        if (po.opt) {
            os << po.opt.value();
        } else {
            os << "No value!";
        }
        return os;
    }
};

printable_optional
first(std::vector<double>& v)
{
    if (v.empty()) {
        return {std::nullopt};
    } else {
        return {v.front()};
    }
}

也就是說,這個練習有點令人費解。

first()返回一個std::optional<T> ,如果ve為空則返回std::nullopt ,否則返回v.front()

然后重載operator<<以打印std::optional<T>

例如:

#include <optional>

template <typename T>
std::optional<T> first(const std::vector<T>& ve){
    if (ve.empty())
        return std::nullopt;
    else
        return ve.front();
}

template <typename T>
std::ostream& operator<<(std::ostream& os, std::optional<T>& op) {
    if (op.has_value())
        os << op.value();
    else
        os << "No value!";
    return os;
}

在線演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM