古いプロジェクトを修正していると同時に、C++11 にするためにいくつかのことを更新しています。
boost::date_time のさまざまな使用法を std::chrono の新しい機能に置き換えたいと思います。しかし、Boost::date_time::not_a_date_time に相当する C++11 が何かわかりません。
time_point 変数がまだ割り当てられていないか、有効なタイムスタンプが含まれていないことを示す C++11 に相当するものはありませんか?
古いプロジェクトを修正していると同時に、C++11 にするためにいくつかのことを更新しています。
boost::date_time のさまざまな使用法を std::chrono の新しい機能に置き換えたいと思います。しかし、Boost::date_time::not_a_date_time に相当する C++11 が何かわかりません。
time_point 変数がまだ割り当てられていないか、有効なタイムスタンプが含まれていないことを示す C++11 に相当するものはありませんか?
boost::date_time
内部で整数時間表現を使用し、内部で特別な値を定義しますboost/date_time/int_adapter.hpp
。
static const int_adapter pos_infinity()
{
return (::std::numeric_limits<int_type>::max)();
}
static const int_adapter neg_infinity()
{
return (::std::numeric_limits<int_type>::min)();
}
static const int_adapter not_a_number()
{
return (::std::numeric_limits<int_type>::max)()-1;
}
static int_adapter max BOOST_PREVENT_MACRO_SUBSTITUTION ()
{
return (::std::numeric_limits<int_type>::max)()-2;
}
static int_adapter min BOOST_PREVENT_MACRO_SUBSTITUTION ()
{
return (::std::numeric_limits<int_type>::min)()+1;
}
基本的に、特定の整数値が特別な意味を持つように予約されています。
ただし、他の人が指摘しているように、std::chrono
これらの特別な値は提供されません (関数min
とmax
関数のみがあります)。また、std::numeric_limits
特殊化されていません ( Why does std::numeric_limits<seconds>::max() return 0?を参照)。
Ben Voigt の回答は可能な回避策を示していますが、std::chrono
クラスはそのようなセマンティクスを指定していないため、自分で作成していない関数に NaN タイムスタンプまたは期間を渡すと、未定義の動作が発生する可能性があることに注意してください。
グループの一員として存在するという事実を考えると
bool is_infinity() const bool is_neg_infinity() const bool is_pos_infinity() const bool is_not_a_date_time() const
これは、内部表現に浮動小数点型を使用し、値を NaN (非数値) に設定することによって行われることは明らかです。
ではstd::chrono
、表現型は算術型である必要があります。したがって、浮動小数点型は適格であり、同じトリックを使用できます。
を指定するとstd::duration
、次を使用してテストできます
std::isnan(dur.count())
(当然のことながら、浮動小数点トラップをトリガーしないように、シグナリング NaN ではなく、静かな NaN 値を使用する必要があります)