gpt4 book ai didi

c++ - 在某些情况下使用 auto 作为返回类型和返回值 nullptr

转载 作者:行者123 更新时间:2023-11-28 01:19:56 29 4
gpt4 key购买 nike

如果我们有返回类型为 auto 的方法, 但在方法中我们将返回一个新对象或 nullptr .如果我正确理解我们何时返回nullptr ,它还会通过构造函数创建新对象。

方法是With .

下一个问题:将使用哪种类型代替 auto ?这将取决于 maybe 返回的类型或不: maybe是一个返回 Maybe<T> 的函数.当我们先调用With返回类型是 Maybe< Adress > ;第二步可能是Maybe< Adress > since 是对象的类型或 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

}

最佳答案

Which type will be used in place of auto?

函数的返回类型由单个 return 中表达式的类型决定陈述。在您的情况下,声明是:

return context != nullptr ? maybe(evaluator(context)) : nullptr;

返回的表达式是一个三元运算符,其两个潜在值具有不同的类型( Maybe<C> ,对于某些类 C 不一定是 Tnullptr_t )。只有当其中一种类型可以隐式转换为另一种类型时,这才是良构的。通常 nullptr_t仅与其他指针类型相互转换,因此让我们看一下为 Maybe 定义的隐式转换(只有一个):

Maybe(T *context) : context(context) { }

指针类型可以转换为 Maybe .所以nullptr转换为 C*然后转换为 Maybe<C>对象(其上下文为空)。同样,我正在使用 C而不是 T因为此类型不需要与属于 *this 类型的模板参数相同.无论 context 的值如何,返回的类型都是相同的.

如果要查看此隐式转换中断,请转换为 Maybe明确的,如 explicit Maybe(T *context) : context(context) { } .

关于c++ - 在某些情况下使用 auto 作为返回类型和返回值 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56916096/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com