отрицание std :: integra_constant & lt; bool & gt;

Извините, что задаю такой простой вопрос, но я не могу найти ответ легко. Google не говорит ничего интересного о «C ++ negal integra_constant» и подобных запросах.

Есть ли в C ++ 11 какие-либо черты, которые делают std::true_type от std::false_type и наоборот? Другими словами, я хотел бы получить более приемлемую версию

std::is_same<my_static_bool, std::false_type>

Я знаю, конечно, что могу написать сам, но я бы хотел использовать уже существующую, если она есть.

3

Решение

Это не так, потому что это по существу <type_traits> должно быть как можно меньше.

template <typename T> using static_not = std::integral_constant<bool, !T::value>;

Использование:

static_not<my_static_bool>

Это правильный путь, потому что стандарт всегда гласит:false_type или происходит от такого «, так что вы не можете зависеть от того, чтобы быть равным std::false_type, Я обычно расслабляю это, чтобы иметь «constexpr логический ::value свойство «, потому что я не использую диспетчеризацию тегов.

5

Другие решения

Еще один способ сделать это:

template <typename T>
using static_not = typename std::conditional<
T::value,
std::false_type,
std::true_type
>::type;
4

В следующем коде используется пересылка метафункций шаблона (т.е. он наследуется от std::integral_constant с отрицательным логическим значением, это, конечно, вдохновлено Boost.MPL что интенсивно использует этот шаблон)

#include <type_traits>

template<typename T>
struct logical_not
:
std::integral_constant<bool, !T::value>
{};

int main()
{
typedef logical_not<std::false_type>::type T;
typedef logical_not<std::true_type>::type F;

static_assert((std::is_same<T, std::true_type>::value), "");
static_assert((std::is_same<F, std::false_type>::value), "");
}

Выход на LiveWorkSpace

2

Типы true_type а также false_type иметь вложенный typedef, который ссылается на себя, так что вы можете написать:

std::is_same<my_static_bool::type,std::false_type>::value

В зависимости от контекста может быть проще сделать !my_static_bool{}, который является constexpr стоимости true если ваш тип действительно std::false_type,

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector