什么是std::false_type或std::true_type?

29

我看到它的用法如下:

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结构是什么?


9
查找:类型特性(type traits)。 - NathanOliver
related/dupe: https://dev59.com/Ya3la4cB1Zd3GeqPISon - NathanOliver
更好的复制链接:https://dev59.com/yWIj5IYBdhLWcg3wUjzG - AndyG
还有更多的代码吗?我想知道是否有DependentFalse或RadarSensor的模板特化? - user9400869
2个回答

25

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
};

它用于表示falsetrue作为类型。这在类型特征中非常有用,其中您可以让类模板从std::false_typestd::true_type继承以进行不同(部分)特化,具体取决于模板参数满足的某些条件。这样做可以测试给定类型是否满足类型特征的条件,并通过访问从std::false_typestd::true_type继承的静态value成员或通过使用转换运算符转换类型特征的实例来获得编译时常量
您展示的是一个简单的类型特征,它始终(对于所有T)计算为std::false_type。它用于static_asserts,当实例化包含它们的模板时应始终失败。这是必要的,因为不依赖于模板参数的static_assert已在定义点触发,而不是实例化点,因此使得包含像static_assert(false);的程序都是不合法的。

它具有constexpr转换为布尔值,在C++11之后的版本中非常有用,这可能是每个使用std::true_type的人都应该知道的事情。 - Yakk - Adam Nevraumont
@Yakk-AdamNevraumont 我已经添加了它。 - walnut

0

可能会有一个特殊化的DependentFalse,用于Identifier,看起来可能像这样:

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

这可以确保只要模板参数不满足特化所需的条件(在这种情况下为 Identifier 类型),就不能编译 RadarSensor


我认为不是这样的,那样做会与命名相反。相反,可能有一个RadarSensor的专门化版本,它不包含static_assert - walnut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接