我想知道,引入std::bool_constant
及其后续用于std::true_type
和std::false_type
的原因是什么(以及标头{{1中定义的比较结构) C ++ 17中的,参见N4389)
到目前为止,我只能找到包含措辞的文件:
虽然两篇论文都提到了"理由" - https://issues.isocpp.org/show_bug.cgi?id=51 - 链接评论供稿主要表明这是"基于对c ++ std-lib *"的讨论。 (大概是指私人反射器?)而没有进一步的细节。
以下是文档: http://en.cppreference.com/w/cpp/types/integral_constant
答案 0 :(得分:16)
这是纯粹的语法糖。通常,我们使用例如像这样的tag-dispatching:
void foo_impl(std::false_type) { /*Implementation for stuff (and char) */}
void foo_impl(std::true_type ) { /*Implementation for integers but not char*/}
template <typename T>
void foo(T) {
foo_impl(t, std::bool_constant<std::is_integral<T>{} && !std::is_same<char, T>{}>());
}
如果没有bool_constant
,我们必须使用更长的类型说明符来指定所需的类型:std::integral_constant<bool, ...>
。由于特别经常弹出integral_constant
对布尔值的使用,因此要求提供简洁明了的专业化方法,bool_constant
提供了这一点。
事实上,bool_constant
只不过是bool
的别名模板 - integral_constant
的专业化:
template <bool B>
using bool_constant = integral_constant<bool, B>;
true_type
和false_type
(以及integral_constant<bool, ..>
的其他用法)的声明被更改的唯一原因是标准的简洁,甚至;没有技术需求,因为integral_constant<bool, false>
和bool_constant<false>
指定了完全相同的类型。