C++ - 将类型映射到枚举

发布于 2024-09-27 10:28:08 字数 1020 浏览 4 评论 0原文

可以使编译时 Type ->枚举系列映射?

用一个例子来说明:

比方说,我有一些 Type 和一个枚举值:

typedef int Type;

enum Enumerated { Enum1, Enum2, Enum3, Enum4 };

现在我以某种方式声明以下内容:“让我们关联 Enum1枚举4 类型为 Type (还不知道如何实现)。


现在我希望能够检查以下内容(最好是在编译时使用 mpl 完成):

如果某些任意类型和枚举实际上相互映射:

template <typename ArbitraryType, Enumerated E>
struct check_at_compile_time {
   // Somehow tricky evaluate this
   static const bool value;
};

,结果如下:

check_at_compile_time<Type, Enum1>::value evaluates to TRUE

check_at_compile_time<Type, Enum2>::value evaluates to FALSE

check_at_compile_time<Type, Enum4>::value evaluates to TRUE

check_at_compile_time<int, Enum3>::value evaluates to FALSE

>如果有人知道实现此目的的好方法,请帮助我。也许使用 boost::mpl 的东西,我不确定。

谢谢。

Is is possible to make compilation-time Type -> Enum Series mapping?

Illustrating with an example:

Let's say, I have some Type and a enumerated value:

typedef int Type;

enum Enumerated { Enum1, Enum2, Enum3, Enum4 };

and now I somehow state the following: "let's associate Enum1 and Enum4
with type Type (don't know how to implement this yet).


Now I want to be able to check the following (better to be done using mpl in compilation time):

If some arbitrary type and enum are actually being mapped to each other:

template <typename ArbitraryType, Enumerated E>
struct check_at_compile_time {
   // Somehow tricky evaluate this
   static const bool value;
};

so that the results are the following:

check_at_compile_time<Type, Enum1>::value evaluates to TRUE

check_at_compile_time<Type, Enum2>::value evaluates to FALSE

check_at_compile_time<Type, Enum4>::value evaluates to TRUE

check_at_compile_time<int, Enum3>::value evaluates to FALSE

If someone knows a nice way to implement this, please help me. Maybe something using boost::mpl, I'm not sure.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

本王不退位尔等都是臣 2024-10-04 10:28:08

即使没有 boost.mpl,你也可以这样做:

template< Enumerated Value > struct Enumerated2Type { typedef void type; enum { value = false }; };
#define DEFINE_ENUMERATED_TYPE(TYPE, ENUM) template<> struct Enumerated2Type<ENUM> { typedef TYPE type; enum { value = true }; }
DEFINE_ENUMERATED_TYPE(int, Enum1);
DEFINE_ENUMERATED_TYPE(bool, Enum2);
DEFINE_ENUMERATED_TYPE(double, Enum3);
DEFINE_ENUMERATED_TYPE(std::string, Enum4);

并且你检查你可以这样做:

template <typename ArbitraryType, Enumerated E>
struct check_at_compile_time {
    static bool const value = Enumerated2Type< E >::value && boost::is_same< ArbitraryType, typename Enumerated2Type< E >::type >::value;
};

未经测试,但应该像这样工作。

You can do it this way even without boost.mpl:

template< Enumerated Value > struct Enumerated2Type { typedef void type; enum { value = false }; };
#define DEFINE_ENUMERATED_TYPE(TYPE, ENUM) template<> struct Enumerated2Type<ENUM> { typedef TYPE type; enum { value = true }; }
DEFINE_ENUMERATED_TYPE(int, Enum1);
DEFINE_ENUMERATED_TYPE(bool, Enum2);
DEFINE_ENUMERATED_TYPE(double, Enum3);
DEFINE_ENUMERATED_TYPE(std::string, Enum4);

And you check you can do this way:

template <typename ArbitraryType, Enumerated E>
struct check_at_compile_time {
    static bool const value = Enumerated2Type< E >::value && boost::is_same< ArbitraryType, typename Enumerated2Type< E >::type >::value;
};

Untested but should work like this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文