gpt4 book ai didi

c++ - C++ 中的标准或惯用空对象

转载 作者:行者123 更新时间:2023-12-04 12:07:40 25 4
gpt4 key购买 nike

我经常需要在 C++ 中定义一个空对象,它通常是一个没有任何成员或方法的结构:

struct Dummy {};
相同想法的转世包括类似 nill_t 的类。 , null_t , Empty , None等等。
我想知道是否有 符合此描述的标准库对象 (空类,用作“无”或“空”的标记) 或定义它的规范方式 (专有名称等)。一种想法是使用 std::false_type但不幸的是,这个类(class)远非空缺。

编辑 :
理想情况下,我会使用 Standard None 类型作为(n 空)基础来拥有丰富的名称描述和隐藏实现(或按原样使用,在有意义的地方)
struct Dummy : std::none {};
struct Noop : std::none {};
让语言处理复杂的“虚无”,就像@Barry 在他的回答中提到的那样,或者例如提供始终返回 false 的相等运算符(如 NaN)或任何语言认为“没有”的“适当行为”都会很好。
问题只是询问是否有标准的 None 或 Empty 或 Nothing 类型,我从不建议在没有意义的地方使用它来混淆代码。

最佳答案

C++ 标准库实际上有大量的“空”类型。 std::monostate , std::nullopt_t , std::in_place_t标签类型等。它们都有不同的名称,因为它们用于不同的目的。
你不应该有一种通用的“空”类型,因为看到那里的名字会告诉你代码在做什么。 std::optional<T>(std::in_place, ...)std::optional<T>(std::monostate{}, ...) 传达更多关于正在发生的事情的信息.
事实上,如果使用单一类型,您将无法区分 std::optional<T>(std::nullopt)std::optional<T>(std::in_place) .这是两个非常不同的函数调用。
您使用的名称应该是使使用它的代码可读的任何名称。
至于规范约定,C++ 标准根据您的使用方式使用某些约定。用户应该直接输入到他们的代码中的类型,如 std::monostate , 正常命名。您应该创建 variant s 使用 monostate在类型中。
标签类型,用于选择构造函数或operator()重载,通常以 _t 结束.但他们也有一个 inline constexpr为它们定义的不以 _t 结尾的变量.例如,std::nullopt_t是类型的名称,而 std::nullopt是该类型变量的名称。
这一点尤为重要,如 std::nullopt_t不能由用户直接构造。您可以复制std::nullopt实例,但您不能创建 std::nullopt_t直接实例。
最后一点是标准有点不一致的地方。大多数标签类型没有这个要求;您可以调用 std::in_place_t{}所有你喜欢。但是std::nullopt_t做。

您评论中的示例:

as the default tag in struct templates, as the default tag in function templates


我不知道在这种情况下什么是“默认标签”,但我可能会称之为 default_t .因为这说明了事物的含义。

as the "no output" tag in a processing pipeline


我会拼这个 void或者如果这不是一个选项, dropdiscard .

as the equivalent of Python's None in some generic code


那已经有一个名字: nullptr .如果它是一个可能存在也可能不存在的非指针,则拼写为 std::optional<T> .如果你真的使用通用代码, std::nullopt本身作为一种方式来表明用户在概念上提供了一个空 optional .
这些是具有不同解释含义的不同用途。因此,即使它们都实现为等效类型,它们也不应该具有相同的名称。

关于c++ - C++ 中的标准或惯用空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67606956/

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