4

古いプロジェクトを修正していると同時に、C++11 にするためにいくつかのことを更新しています。

boost::date_time のさまざまな使用法を std::chrono の新しい機能に置き換えたいと思います。しかし、Boost::date_time::not_a_date_time に相当する C++11 が何かわかりません。

time_point 変数がまだ割り当てられていないか、有効なタイムスタンプが含まれていないことを示す C++11 に相当するものはありませんか?

4

2 に答える 2

2

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これらの特別な値は提供されません (関数minmax関数のみがあります)。また、std::numeric_limits特殊化されていません ( Why does std::numeric_limits<seconds>::max() return 0?を参照)。

Ben Voigt の回答は可能な回避策を示していますが、std::chronoクラスはそのようなセマンティクスを指定していないため、自分で作成していない関数に NaN タイムスタンプまたは期間を渡すと、未定義の動作が発生する可能性があることに注意してください。

于 2016-07-19T15:10:55.970 に答える
2

グループの一員として存在するという事実を考えると

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 値を使用する必要があります)

于 2014-09-17T01:00:40.207 に答える