std::bool_constant 背后的理由
Rationale behind std::bool_constant
我想知道,引入 std::bool_constant
及其随后用于 std::true_type
和 std::false_type
的基本原理是什么(以及 [=36= 中定义的比较结构) ] <ratio>
, cf. N4389) 在 C++17 中?
到目前为止,我只能找到包含以下措辞的论文:
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4334.html
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4389.html
虽然两篇论文都提到了 "rationale" -- https://issues.isocpp.org/show_bug.cgi?id=51 -- linked-to 评论提要大多指出这是 "Based on the discussion on c++std-lib*"(大概指的是私有反射器?),无需深入了解。
这是文档:
http://en.cppreference.com/w/cpp/types/integral_constant
它是纯粹的语法糖。通常,我们使用例如像这样发送标签:
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>
指定完全相同的类型。
我想知道,引入 std::bool_constant
及其随后用于 std::true_type
和 std::false_type
的基本原理是什么(以及 [=36= 中定义的比较结构) ] <ratio>
, cf. N4389) 在 C++17 中?
到目前为止,我只能找到包含以下措辞的论文:
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4334.html
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4389.html
虽然两篇论文都提到了 "rationale" -- https://issues.isocpp.org/show_bug.cgi?id=51 -- linked-to 评论提要大多指出这是 "Based on the discussion on c++std-lib*"(大概指的是私有反射器?),无需深入了解。
这是文档: http://en.cppreference.com/w/cpp/types/integral_constant
它是纯粹的语法糖。通常,我们使用例如像这样发送标签:
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>
指定完全相同的类型。