Что такое std::false_type или std::true_type?

Я видел его использование, как показано ниже

template <typename T>
struct DependentFalse : std::false_type
{};

Затем он используется здесь

template <typename T>
class RadarSensor
{
    static_assert(DependentFalse<T>::value, "RadarSensor must be created using Identifier template");
};

Я не понимаю, для чего он используется?

Что такое структура DependentFalse?


person TonyParker    schedule 04.11.2019    source источник
comment
Посмотрите: тип черты   -  person NathanOliver    schedule 04.11.2019
comment
Есть еще код? Я хотел бы знать, есть ли специализация шаблона для DependentFalse или RadarSensor?   -  person    schedule 04.11.2019


Ответы (2)


std::false_type используется как строительный блок в признаках типа и определяется как std::integral_constant<bool, false> (здесь я его пропущу). Его определение сводится к чему-то вроде этого (упрощенно):

struct false_type {
    static constexpr bool value = false;
    constexpr operator bool() const noexcept { return value; }
    // There is more here, but it doesn't really matter for your question
};

Сходным образом:

struct true_type {
    static constexpr bool value = true;
    constexpr operator bool() const noexcept { return value; }
    // There is more here, but it doesn't really matter for your question
};

Он используется для представления значений false и true в виде типов. Это полезно в признаках типа, когда вы позволяете шаблону класса наследоваться от std::false_type или std::true_type для разных (частичных) специализаций, в зависимости от некоторого условия, которому соответствует аргумент шаблона. Это позволяет проверить, удовлетворяет ли данный тип условию признака типа, и получить константу времени компиляции value, указывающую результат посредством доступа к статическому члену value, который унаследован либо от std::false_type, либо от std::true_type. или альтернативно путем преобразования экземпляра признака типа с помощью оператора преобразования.

Здесь вы показываете простую черту типа, которая всегда (для всех T) оценивается как std::false_type. Он используется в static_asserts, который всегда должен давать сбой при создании экземпляра шаблона, в котором они расположены. Это необходимо, потому что static_assert, который не зависит от параметра шаблона, запускается уже в точке определения, а не в точке инстанцирования, что делает каждую программу, содержащую что-то вроде static_assert(false);, неправильно сформированной.

person walnut    schedule 04.11.2019
comment
Тот факт, что он имеет constexpr convert-to-bool, который очень полезен в версиях C++ после C++11, вероятно, должен знать каждый, кто работает с std::true_type. - person Yakk - Adam Nevraumont; 04.11.2019
comment
@Yakk-AdamNevraumont Я добавил это. - person walnut; 04.11.2019

Вероятно, существует специализация DependentFalse для Identifier, которая может выглядеть так:

 template<class ... Args>
 class  DependentFalse<Identifier<Args...>> : public std::true_type {}

Это гарантирует, что вы не сможете скомпилировать RadarSensor, пока параметр шаблона не заполнит все, что необходимо для специализации (в данном случае имеет тип Identifier).

person Community    schedule 04.11.2019
comment
Я так не думаю, это противоречило бы названию. Скорее всего, существует специализация RadarSensor, которая не содержит static_assert. - person walnut; 04.11.2019