gpt4 book ai didi

c++ - 现代 C++ 中的目标类型

转载 作者:行者123 更新时间:2023-12-05 08:45:59 26 4
gpt4 key购买 nike

当我说目标类型时,我的意思是使用接收者变量或参数的类型作为信息来推断我分配给它的部分代码。例如,在 C# 中,您会编写类似这样的内容来传递可为 null 的值或 null (空)如有必要:

void f(int? i) {}
void caller(bool b) =>
f(b ? 5 : null); // value is bound to an int? parameter so all information
// to build this object is already in code

我能想到的最好的 C++ 是这样的:

void f(const optional<int>& i) {}
void caller(bool b)
{
f(b ? make_optional(5) : optional<int>());
}

它有效,但它需要我写 optional两次并提供一次可选类型,即使所有信息都应该已经在代码中。以我的拙见,这就是类型推断应该为您做什么,而不必每行重复多次。并且因为以下内容确实有效:

optional<int> i;
i = {}; // empty
i = {5}; // a value

我原以为下一个合乎逻辑的步骤也会奏效:

void f(const optional<int>& i) {}
void caller(bool b)
{
f(b ? {5} : {}); // doesn't compile
}

总的来说,从各种实验来看,目标类型似乎在直接为变量赋值时有效,但不是作为绑定(bind)到参数的三元条件表达式的一部分?我理解正确吗? C++ 版本没有限制,例如,我一直在用 MS C++20 编写它。

还有一个相关问题,虽然不是我问题的主要焦点,但有没有更好的方法来编写 optional<>是否可以基于 bool 值进行初始化?

最佳答案

在 C++ 中,表达式有类型。

{}但是,它不是一个表达式。 {} 有一些受限的上下文可以在您期望表达式应该放在那里时使用。这不会使 {}变成一个表达式。

?:是一个操作,它的参数必须有类型。 ?: 的类型派生自它的 2 个参数的类型(规则很复杂,但它试图找到一个通用类型)。

b ? std::optional{5} : std::nullopt;

与您想要的相似。在这里,事实 std::nullopt可以转换为 std::optional<int>用于推断 ?: 的类型表达。

你也可以这样写:

template<class T>
std::optional<std::decay_t<T>> maybe( bool b, T&& t ) {
if (!b) return std::nullopt;
return std::forward<T>(t);
}

让你写

maybe( b, 5 )

针对您的情况。

可以用 template<class T> operator T() 做更有趣的事情在一个类型上推断出您要返回的类型。

但是,一般来说,C++ 类型系统是单向的。

关于c++ - 现代 C++ 中的目标类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70761598/

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