0
#include "boost/date_time/gregorian/gregorian.hpp"

int main()
{
    boost::gregorian::greg_weekday dWeek(boost::date_time::Wednesday);

    //Code One
    // warning C4482: nonstandard extension used: enum 'boost::date_time::weekdays' used in qualified name
    if (dWeek.as_enum()==boost::gregorian::greg_weekday::weekday_enum::Wednesday)
    {
        std::cout << "Today is Wednesday" << std::endl;
    }

    //class BOOST_DATE_TIME_DECL greg_weekday : public greg_weekday_rep {
    //public:
    //    typedef boost::date_time::weekdays weekday_enum;

    //Code Two
    if (dWeek.as_enum()==boost::date_time::Wednesday)
    {
        std::cout << "Today is Wednesday" << std::endl;
    }
}

问题> 我见过大量使用Code One来比较boost::date_time. 基于 C++ 标准,枚举的使用是不正确的。我提供了一个解决方案,代码二

有人可以让我快速看一下,看看它是否是正确的比较方法?

谢谢

4

1 回答 1

1

编辑:更正

利用

boost::date_time::Wednesday

我没有查看 as_enum() 返回的类型。修复它,编译和工作(在 MSVC2k10,Boost 1.48.0 自建)

EDIT2:你会发现它隐藏在 boost/date_time/gregorian/greg_facet.hpp 中。

namespace boost{
namespace gregorian{
  typedef boost::date_time::weekdays weekday_enum;
}
}

无论如何,其余信息的相关部分是有一个 boost::date_time::weekdays::Wednesday,但我们去掉了工作日。

枚举基本上是这样的:

enum foo { bar = 1, barre = 2, barred = 3 };
// Is sort-of the same as
typedef static const int foo;
foo bar = 1;
foo barre = 2;
foo barred = 3;

foo 不是命名空间,也不是结构或类似的东西,它更像是一个类型名。

我知道这并不完全相同,但也可能是为了使用它们。在这样的类型中使用 weekday_enum 限定符基本上会给编译器带来一点点垃圾来解析,就像说:

typedef int foo;
struct S {
  static foo var;
} p;

p.foo::var = 4; // Does this make sense? Nope...
于 2012-04-11T15:32:22.853 回答