[英]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.