Является пустой строкой, определенной стандартом С++?
Есть ли какая-либо структура std::empty
или что-то подобное или мне нужно определить мое собственное:
struct empty{};
Это можно использовать очень хорошо в сочетании с std::conditional
или другими новыми функциями std, и мне интересно, определяет ли это стандарт или нет.
Ответы
Ответ 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 делает варианты по умолчанию конструктивными.