std :: bool_constant背后的基本原理

时间:2015-06-03 17:20:20

标签: c++ c++17

我想知道,引入std::bool_constant及其后续用于std::true_typestd::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

1 个答案:

答案 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_typefalse_type(以及integral_constant<bool, ..>的其他用法)的声明被更改的唯一原因是标准的简洁,甚至;没有技术需求,因为integral_constant<bool, false>bool_constant<false>指定了完全相同的类型。