Является пустой строкой, определенной стандартом С++? - программирование
Подтвердить что ты не робот

Является пустой строкой, определенной стандартом С++?

Есть ли какая-либо структура std::empty или что-то подобное или мне нужно определить мое собственное:

struct empty{};

Это можно использовать очень хорошо в сочетании с std::conditional или другими новыми функциями std, и мне интересно, определяет ли это стандарт или нет.

4b9b3361

Ответ 1

В стандартной библиотеке С++ такого не существует. Как уже упоминалось в комментариях, вы все равно можете найти boost::blank в Boost, который, вероятно, наиболее похож на класс, который вы ищете. Если бы такой класс существовал в стандартной библиотеке, я не думаю, что было бы так много сторонних библиотек, определяющих их собственные struct empty {}.

Если вы хотите просто класс без элементов данных и минимально возможный размер - не может быть меньше 1 - (и, возможно, извлечь выгоду из пустой оптимизации базы), вы все равно можете использовать std::tuple<>. Он фактически используется для этой цели (оптимизация пустой базы) в реализации некоторых классов в libstdС++.

Если вы хотите, чтобы std::tuple<> действительно был пустым классом:

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

int main()
{
    // prints 1
    std::cout << std::is_empty< std::tuple<> >::value;
}

Ответ 2

Если я правильно понял ваш вопрос, вы ищете тип возврата ошибки для использования с std::conditional. Обычно люди определяют свои собственные типы структуры для метапрограммирования. Это имеет смысл, поскольку обычно невозможно создавать библиотеки метапрограммирования таким образом, чтобы они могли легко взаимодействовать с произвольными другими библиотеками времени компиляции.

Ближайшая вещь к стандарту де-факто, вероятно, Boost.MPL, поэтому используйте что-то вроде mpl:: void_ может иметь смысл в вашей ситуации.

Если вы настаиваете на том, чтобы придерживаться стандартных типов, nullptr_t кажется хорошим совпадением.

Ответ 3

Существует раздел для добавления такого типа конструкции как часть предложения Вариант (n4542).

После голосования,

Что мы хотим назвать типом stand-in "empty_t"?
empty_t 4
пусто 4
one_t 1
пустое 6
blank_t 7
моностат 7

Стоки:
blank * 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; }

Ответ 4

Он определен как std :: monostate в заголовке <вариант>

struct monostate { };

Это используется, например, в std::variant (type-safe union), где std::variant<std::monostate> представляет пустой вариант. Monostate делает варианты по умолчанию конструктивными.