2013-05-21 6 views
16

Есть ли std::empty структура или нечто подобное, или мне нужно, чтобы определить мой собственный:Является пустой строкой, определенной стандартом C++?

struct empty{}; 

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

+2

насколько мне известно, нет. –

+0

Вам нужна структура, которая просто не имеет элементов данных (таким образом, имеет размер 1) или действительно пустую структуру? – kennytm

+3

Возможно, 'std :: tuple <>'? – jogojapan

ответ

5

В стандартной библиотеке 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; 
} 
4

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

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

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

+1

Использование 'nullptr_t' для этого на самом деле неплохая идея. – jleahy

+0

Единственная проблема с 'nullptr_t' заключается в том, что если instanciated, он должен быть как минимум большим как экземпляр' void * '. Это не должно быть проблемой, если использовать только метапрограммирование. – Morwenn

2

Существует раздел, который добавит этот вид конструкции как часть Variant proposal (n4542).

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

Что мы хотим назвать «empty_t» подмен типа?
empty_t 4
пусто 4
one_t 1
заготовки 6
blank_t 7
monostate 7

Стоки:
пустым * 3
monostate 8

согласованное имя будет be: 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; } 
Смежные вопросы