Извините, что задаю такой простой вопрос, но я не могу найти ответ легко. Google не говорит ничего интересного о «C ++ negal integra_constant» и подобных запросах.
Есть ли в C ++ 11 какие-либо черты, которые делают std::true_type
от std::false_type
и наоборот? Другими словами, я хотел бы получить более приемлемую версию
std::is_same<my_static_bool, std::false_type>
Я знаю, конечно, что могу написать сам, но я бы хотел использовать уже существующую, если она есть.
Это не так, потому что это по существу <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
свойство «, потому что я не использую диспетчеризацию тегов.
Еще один способ сделать это:
template <typename T>
using static_not = typename std::conditional<
T::value,
std::false_type,
std::true_type
>::type;
В следующем коде используется пересылка метафункций шаблона (т.е. он наследуется от 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
Типы true_type
а также false_type
иметь вложенный typedef, который ссылается на себя, так что вы можете написать:
std::is_same<my_static_bool::type,std::false_type>::value
В зависимости от контекста может быть проще сделать !my_static_bool{}
, который является constexpr
стоимости true
если ваш тип действительно std::false_type
,