是否由C ++标准定义了空结构?

时间:2013-05-21 09:42:54

标签: c++ c++11

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

struct empty{};

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

4 个答案:

答案 0 :(得分:5)

c ++标准库中没有这样的东西。正如评论中所提到的,你仍然可以在Boost中找到boost::blank,这可能与你正在寻找的类最相似。如果标准库中存在这样的类,我认为不会有那么多第三方库定义自己的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;
}

答案 1 :(得分:5)

有一节要添加这种构造作为Variant proposal (n4542)的一部分。

投票后,

  

我们想要称之为“empty_t”替身类型?
  empty_t 4
  空4   one_t 1
  空白6
  blank_t 7
  monostate 7

     

径流:
  空白* 3
  monostate 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; }

答案 2 :(得分:4)

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

与事实上的标准最接近的可能是Boost.MPL,所以使用像mpl::void_这样的东西可能会对你的情况有所帮助。

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

答案 3 :(得分:3)

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

struct monostate { };

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