前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ RTTI

C++ RTTI

作者头像
RainMark
发布2019-09-04 16:56:01
4020
发布2019-09-04 16:56:01
举报
文章被收录于专栏:RainMark 的文章RainMark 的文章
  • Custom RunTime Type Info
代码语言:javascript
复制
#include <iostream>
#include <string>

enum class SimpleType {
    ST_INVALID, ST_INT64, ST_UINT64, ST_DOUBLE, ST_STRING
};

#define SIMPLE_TYPE_MACRO(MY_MACRO, ...)                            \
    MY_MACRO(SimpleType::ST_INT64,  int64_t,     ##__VA_ARGS__);    \
    MY_MACRO(SimpleType::ST_UINT64, uint64_t,    ##__VA_ARGS__);    \
    MY_MACRO(SimpleType::ST_DOUBLE, double,      ##__VA_ARGS__);    \
    MY_MACRO(SimpleType::ST_STRING, std::string, ##__VA_ARGS__)

template<SimpleType stype>
struct SimpleType2BuiltinType {
    struct InvalidType {};
    typedef InvalidType BuiltinType;
};

#define SimpleType2BuiltinTypeTraits(stype, btype, ...) \
    template<>                                          \
    struct SimpleType2BuiltinType<stype> {              \
        typedef btype BuiltinType;                      \
    }

SIMPLE_TYPE_MACRO(SimpleType2BuiltinTypeTraits);
#undef SimpleType2BuiltinTypeTraits

class Object {
public:
    Object(SimpleType stype)
        : type_(stype) {}
    ~Object() {}

public:
    virtual SimpleType type() const {
        return type_;
    }
    virtual void type(SimpleType stype) {
        type_ = stype;
    }

private:
    SimpleType type_;
};

template<class T>
class BasicType : public Object {
public:
    BasicType(SimpleType stype)
        : Object(stype) {}
    ~BasicType() {}

public:
    virtual void value(const T& value) {
        value_ = value;
    }
    virtual const T& value() const {
        return value_;
    }

private:
    T value_;
};
typedef BasicType<std::string> String;

int main(int argc, char *argv[]) {
    std::string v("foo");
    String foo(SimpleType::ST_STRING);
    foo.value(v);
    Object* object = &foo;

    switch (object->type()) {
    #define GET_VALUE(stype, ...)                                               \
            case stype: {                                                       \
                typedef SimpleType2BuiltinType<stype>::BuiltinType Type;        \
                BasicType<Type>* typed = static_cast<BasicType<Type>*>(object); \
                const Type& v = typed->value();                                 \
                std::cout << v << std::endl;                                    \
                break;                                                          \
            }

    SIMPLE_TYPE_MACRO(GET_VALUE, object);
    #undef GET_VALUE
    default:
        break;
    }
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档