namespace std {
namespace chrono {
template <class Rep>
struct treat_as_floating_point
: is_floating_point<Rep> { };
template <class Rep>
inline constexpr bool treat_as_floating_point_v
= treat_as_floating_point<Rep>::value; // C++17
}}
概要
treat_as_floating_pointは、テンプレートパラメータRepが浮動小数点型かを判定する型特性である。
durationクラスにおいて、他のdurationの型から変換可能な型かどうかを判定するために使用される。treat_as_floating_point<Rep>::value == trueの場合に、duration間の暗黙変換が許可される。そうでない場合、暗黙変換できるかは各durationの周期に依存する。
この型特性は、型が浮動小数点数型のように振る舞うか、すなわち値同士の除算において許容できる精度の損失で済むかを示すことを意図している。
例
#include <cassert>
#include <chrono>
using namespace std::chrono;
int main()
{
// floating point Rep
static_assert(
treat_as_floating_point<duration<double, std::ratio<1, 30>>::rep>::value,
"duration<double, ratio<1, 30>> > must be floating point"
);
// integer Rep
static_assert(
!treat_as_floating_point<milliseconds::rep>::value,
"milliseconds can't become floating point"
);
}
出力
バージョン
言語
- C++11
処理系
- GCC: 4.6.1 ✅
- Visual C++: 2012 ✅, 2013 ✅, 2015 ✅
参照
- P0006R0 Adopt Type Traits Variable Templates from Library Fundamentals TS for C++17
- LWG Issue 951. Various threading bugs #1
- C++11で、
valueがtrueであることが「Repが浮動小数点数型である」ことを意味するのではなく、duration間の暗黙変換を許可することを意味すると明確化された。あわせて、この型特性の意図を述べる注記が追加された
- C++11で、