27

是否有任何std::empty结构或类似的东西,或者我需要定义自己的:

struct empty{};

这可以很好地与std::conditional其他新的 std 功能结合使用,我想知道标准是否定义了它。

4

4 回答 4

10

作为变体提案 (n4542)的一部分,有一个部分可以添加这种构造。

投票通过后,

我们要如何称呼“empty_t”替代类型?
empty_t 4
空 4
one_t 1
空白 6
blank_t 7
单态 7

径流:
空白* 3
单态 8

商定的名称是:std::monostate。


它将通过以下方式定义:

// 2.?, Explicitly default-constructed alternative
struct monostate {};
bool operator<(const monostate&, const monostate&) constexpr
{ return false; }
bool operator>(const monostate&, const monostate&) constexpr
{ return false; }
bool operator<=(const monostate&, const monostate&) constexpr
{ return true; }
bool operator>=(const monostate&, const monostate&) constexpr
{ return true; }
bool operator==(const monostate&, const monostate&) constexpr
{ return true; }
bool operator!=(const monostate&, const monostate&) constexpr
{ return false; }
于 2016-03-12T02:41:52.123 回答
6

它在标头<variant>中定义为std::monostate

struct monostate { };

例如在std::variant(类型安全的联合)中使用它,其中std::variant<std::monostate>表示一个空变体。Monostate 使变体可以默认构造。

于 2019-05-05T09:40:06.250 回答
5

编辑:随着std::monostateC++17 的引入,这个答案已经过时了。有关更多信息,请参阅其他答案。

c++ 标准库中没有这样的东西。正如评论中提到的,您仍然可以boost::blank在 Boost 中找到这可能是与您正在寻找的类最相似的东西。如果标准库中存在这样的类,我认为不会有那么多第三方库定义自己的struct empty {}.

如果您想要的只是一个没有数据成员且大小尽可能小的类 - 不能小于 1 - (并且可能受益于空基优化),您仍然可以使用std::tuple<>. 它实际上用于实现 libstdc++ 中某些类的确切目的(空基优化)。

如果你想确保std::tuple<>真的是一个空类:

#include <iostream>
#include <tuple>
#include <type_traits>

int main()
{
    // prints 1
    std::cout << std::is_empty< std::tuple<> >::value;
}
于 2013-05-21T10:14:53.463 回答
3

如果我正确理解您的问题,您正在寻找用于 with 的错误返回类型std::conditional。通常人们为元编程定义自己的空结构类型。这是有道理的,因为通常不可能以一种可以轻松与任意其他编译时库交互的方式设计元编程库。

最接近事实标准的可能是Boost.MPL,因此在您的情况下使用类似mpl::void_的东西可能是有意义的。

如果你坚持坚持标准类型,nullptr_t似乎是一个很好的匹配。

于 2013-05-21T10:45:48.873 回答