8

我想知道,在 C++17 中引入std::bool_constantand (std::true_type以及std::false_typeheader 中定义的比较结构<ratio>,参见 N4389)背后的基本原理是什么?

到目前为止,我只能找到包含以下措辞的文件:

虽然这两篇论文都提到了“基本原理” ——https://issues.isocpp.org/show_bug.cgi?id=51——链接到的评论提要大多指出这是“基于对 c++ 的讨论std-lib*”(大概是指私有反射器?),无需进一步详细说明。

这是文档: http ://en.cppreference.com/w/cpp/types/integral_constant

4

1 回答 1

17

它是纯语法糖。通常,我们像这样使用例如标签调度:

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_constantfor 布尔值的使用特别频繁地弹出,因此需要一种简洁而简短的方法来解决专业化问题,并bool_constant提供了这种方法。
实际上,bool_constant它只不过是bool-specializations of的别名模板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>指定完全相同的类型。

于 2015-06-03T17:32:01.567 回答