如果我们有返回类型为auto
的方法,但是在方法中我们将返回一个新对象或nullptr
。
如果我正确理解何时返回nullptr
,它将通过构造函数创建新对象。
方法是With
。
下一个问题:
将使用哪种类型代替auto
?
它取决于是否由maybe
返回的类型:
maybe
是一个返回Maybe<T>
的函数。
当我们首先调用With
时,返回类型为Maybe< Adress >
;
第二步,它可能是Maybe< Adress >
,因为它是对象的类型,或者是Maybe< std::string >
-如果上下文不是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
}
答案 0 :(得分:2)
将使用哪种类型代替
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>
被转换为C
对象(其上下文为null)。同样,我使用的是T
而不是*this
,因为此类型不必是context
类型的模板参数。无论Maybe
的值如何,返回的类型都是相同的。
如果您希望看到此隐式转换中断,请像explicit Maybe(T *context) : context(context) { }
一样,将转换明确地转换为<table><tbody><tr><th>CHILD </th><th>FATHER </th><th>MOTHER</th></tr><tr><td>Jhon Morris </td><td>David Morris </td><td>Alicia Morris</td></tr><tr><td>Charles Reed </td><td>George Reed </td><td>Megan Reed</td></tr><tr><td>Daniel Morris </td><td>David Morris </td><td>Alicia Morris</td></tr><tr><td>Anthony Morris </td><td>Ronald Morris </td><td>Mary Morris</td></tr></tbody></table>
。
答案 1 :(得分:0)
auto
并不神奇。它只是一个占位符,您的编译器将其填充为具体的推断类型。最终结果与您手动编写推断类型完全相同。
“如果我正确理解何时返回nullptr,它将通过构造函数创建新对象”。否。返回nullptr
不会调用任何构造函数。它只是返回适当类型的空值。没有构造对象。
“哪种类型将改为自动”-返回元组将是您实际上返回是的类型。而且只能是一个特定类型。