[英]Using auto as return type and return value nullptr in some cases
如果我們具有返回類型為auto
的方法,但是在該方法中,我們將返回一個新對象或nullptr
。 如果我正確理解何時返回nullptr
,它將通過構造函數創建新對象。
方法With
。
接下來的問題是:將使用哪種類型代替auto
? 這將取決於類型通過返回maybe
與否: maybe
是返回的函數Maybe<T>
當我們第一次調用With
返回類型為Maybe< Adress >
; 第二步,可能是Maybe< Adress >
因為它是對象的類型,或者Maybe< std::string >
-如果context不是nullptr
則返回。
struct Address {
string* house_name = nullptr;
};
struct Person {
Address* address = nullptr;
};
template <typename T> struct Maybe;
template <typename T> Maybe<T> maybe(T* context)
{
return Maybe<T>(context);
}
template <typename T>
struct Maybe {
T* context;
Maybe(T *context) : context(context) { }
template <typename TFunc>
auto With(TFunc evaluator)
{
return context != nullptr ? maybe(evaluator(context)) : nullptr;
}
};
...
void print_house_name(Person* p)
{
auto z = maybe(p)
.With([](auto x) { return x->address; })
.With([](auto x) { return x->house_name; })
.Do([](auto x) { cout << *x << endl; });
}
int main()
{
//print_house_name(nullptr);
Person p;
print_house_name(&p); // nothing
}
哪種類型將代替
auto
?
函數的返回類型由單個return
語句中的表達式類型決定。 您的情況是:
return context != nullptr ? maybe(evaluator(context)) : nullptr;
返回的表達式是一個三元運算符,其兩個潛在值具有不同的類型( Maybe<C>
,對於某些類C
不一定是T
,並且為nullptr_t
)。 僅當其中一種類型可以隱式轉換為另一種類型時,這種格式才正確。 通常, nullptr_t
僅與其他指針類型進行轉換,因此讓我們看一下為Maybe
定義的隱式轉換(只有一個):
Maybe(T *context) : context(context) { }
指針類型可以轉換為Maybe
。 因此,將nullptr
轉換為C*
,然后將其轉換為Maybe<C>
對象(其上下文為null)。 同樣,我使用C
而不是T
因為此類型不必是*this
類型的一部分的同一模板參數。 無論context
的值如何,返回的類型都是相同的。
如果您希望看到這種隱式轉換中斷,請像explicit Maybe(T *context) : context(context) { }
一樣,將轉換轉換為Maybe
。
auto
不是魔術。 它只是一個占位符,您的編譯器將其填充為具體的推斷類型。 最終結果與您手動編寫推斷類型完全相同 。
“如果我正確理解何時返回nullptr,它將通過構造函數創建新對象”。 否。返回nullptr
不會調用任何構造函數。 它只是返回適當類型的空值。 沒有構造對象。
“哪種類型將代替汽車” -返回TUPE將是什么的你實際上會返回類型 。 那只能是一種特定的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.