27

構造体または類似のものはありますか、std::emptyそれとも自分で定義する必要がありますか:

struct empty{};

これは、または他の新しい標準機能と組み合わせて非常にうまく使用できますstd::conditional。標準で定義されているかどうかは疑問です。

4

4 に答える 4

10

バリアント提案 (n4542)の一部として、この種の構造を追加するセクションがあります。

投票後、

"empty_t" スタンドイン型を何と呼びたいですか?
empty_t 4
empty 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 に答える
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 に答える