Что такое std :: false_type или std :: true_type? - PullRequest
1 голос
/ 04 ноября 2019

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

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?

Ответы [ 2 ]

5 голосов
/ 04 ноября 2019

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, который унаследован от std::false_type или std::true_type или альтернатива путем преобразования экземпляра признака типа с использованием оператора преобразования.

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

0 голосов
/ 04 ноября 2019

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

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

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

...