【问题标题】:C++ - mapping type to enumC++ - 将类型映射到枚举
【发布时间】:2010-10-12 12:17:03
【问题描述】:

是否可以进行编译时Type -> Enum Series 映射?

举例说明:

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

typedef int Type;

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

现在我以某种方式声明以下内容:“让我们关联Enum1Enum4 类型为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 的东西,我不确定。

谢谢。

【问题讨论】:

    标签: c++ templates types enums boost-mpl


    【解决方案1】:

    即使没有 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;
    };
    

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

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多