​C++无宏静态反射全解析,动态反射发生在运行时。


最终可以达到这种效果:

struct Node {
    int a;
    unsigned int b;
    long long c;
    unsigned long long d;
    float e;
    double f;
    char g;
};

Node node1;
auto s = otas_serializer::serialize(node1);
auto node2 = otas_serializer::deserialize<Node>(s);

otas_serializer::serialize用来序列化,otas_serializer::deserialize用来反序列化。

不需要修改结构体,不需要添加宏,不需要配置文件。支持各种STL容器,支持结构体嵌套。

具体实现可以看代码,觉得好请点个star,Ciallo~(∠・ω< )⌒☆

下面开始讲解细节。

关于反射
你或许听说过编程中的反射(reflection)。反射是程序在运行时可以访问、检测和修改它本身状态或行为的一种能力,一个例子是动态获取结构中每个成员的类型与名字。不幸的是,C++几乎不支持动态反射,也不怎么支持静态反射(据说C++26会全面支持,但按照C++委员会的效率和各编译器适配进度,估计也是猴年马月)。

静态反射发生在编译时,动态反射发生在运行时。对于C++反射的研究主要集中在静态反射,经过众多大佬的开发,C++17提供的反射能力终于到勉强能用的程度,这也是本项目的基础。

那么反射有什么用处?在项目中,我们经常需要进行序列化和反序列化,常见方案是给每个struct实现serialize()和deserialize()方法,或者用template针对不同struct进行特化。这项工作相当枯燥,而且很容易出错。事实上,大部分序列化代码都是简单遍历一遍struct的成员,再调用每个成员的序列化方法。

此时一个想法自然地出现:如果有办法能自动遍历整个struct,不就不需要手写序列化代码了吗?但怎么做,我们并不知道某个struct的布局,不知道它有几个成员,每个成员是什么类型。这正是反射所要解决的问题,坐稳,下面我们开始操作。

前置芝士
可变参数模板
C++11中引入了可变参数模板(variadic template),让模板和普通函数一样能传递可变参数。而解包可变参数可以采用模板递归的方法。在这个例子中,print_args会打印所有传入的参数。
template <class T> 
void print_args(T &t) {
    std::cout << t << std::endl;
}

template <class T, class ...Args>
void print_args(T &t, Args &...args) {
    std::cout << t << std::endl;
    print_args(args...);
}
需要注意,模板作用于编译期,能也只能在编译期展开,大部分看起来很奇怪的写法都是因为这个限制。

2. 模板特化

在编写一个通用的函数模板或类模板后,某些类可能需要一些特殊的实现,此时就可以使用模板特化。特化可分为全特化和偏特化。全特化就是针对某种类提供了特殊的实现。

template <class T>
T add(T &a, T &b) {
    return a + b;
}
template <>
auto add<int>(int &a, int &b) {
    return a + b;
}
但有时,我们无法指定具体的类型。比如,我们希望针对指针T *或容器std::vector<T>的模板提供特殊实现。这里只对参数进行了部分限制,并没有指定具体的类型,因此被称为偏特化。偏特化进一步限制模板参数,只有类模板支持偏特化,函数模板不支持偏特化,因为函数可以进行重载,也能达到同样的效果。

template <class T>
struct print_helper {
    static void print(T &t) {
        std::cout << t << std::endl;
    }
}

template <class T>
struct print_helper<std::vector<T>> {
    static void print(std::vector<T> &t) {
        for (auto &item : t) {
            std::cout << t << std::endl;
        }
    }
}
模板匹配的优先级为 全特化 > 偏特化 > 未特化,这点很有用。

3. SFINAE

SFINAE,全称替换失败而非错误(substitution failure is not an error)。在编译期模板替换失败时,不会报错,而是把造成失败的模板给丢弃。对开发者来说,就是你只管写,剩下的交给编译器,不成功也不会导致编译失败。C++17引入std::void_t<T>增强这一机制。如果T是一个合法类型表达式,会返回void,否则就会丢弃掉这个模板。

template <class T, class = void>
struct has_member_name : std::false_type{};

template <class T>
struct has_member_name<T, std::void_t<class T::name>> : std::true_type{};
在这个例子中,如果T类型存在name成员,std::void_t<T>推导成功,has_member_name<T>会匹配到下面的偏特化版本,继承std::true_type。否则触发SFINAE,丢弃下方的模板,匹配到上面的未特化版本,继承std::false_type。

4. 结构化绑定

结构化绑定是C++17引入的一种解包方法,主要用于从std::tuple、std::pair和结构体中取出多个元素。同时,它也支持引用语义。比如,解包一个struct可以这样写:

struct node {
    int a_;
    double b_;
    char c_;
};
node obj;
auto [a, b, c] = obj;
auto &[ar, br, cr] = obj;
不过,结构化绑定必须在编写代码时就确定到底有几个成员。要绑定有n个成员的struct,只能手写n个变量。

5. 列表初始化

C++11引入初始化列表,在实例化对象时,可以按照顺序将列表中的值赋给结构体中的变量,只有在列表的长度小于等于结构体成员个数时,初始化才有可能成功。

class Example {
    int a;
    int b;
};

Example t1{1};
Example t2{1, 2};
Example t3{1, 2, 3};
在这个例子中,Example有两个变量,因此前两个结构体的初始化会成功,第三个会失败。

反射实现
到目前,我们已经凑齐了静态反射所需的所有知识,下面看如何将它们组合起来。首先,如何在编译时获取结构体成员个数。

C++无宏href="c9.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="h7.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="r7.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="f1.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="g4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="i9.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="g4.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="g3.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="e5.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="m0.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="l8.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="g2.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="v4.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="m2.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="u4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="a3.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="g6.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="v1.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="i3.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="i5.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="e8.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="e7.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="a1.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="s9.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="k7.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="c4.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="m1.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="w4.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="j7.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="z0.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="s9.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="a5.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="l5.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="x5.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="f1.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="s6.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="x4.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="v0.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="m1.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="d7.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="f5.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="g9.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="l0.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="m1.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="j1.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="q9.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="g6.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="r6.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="x9.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="c5.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="e2.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="r5.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="l7.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="d0.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="x9.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="c4.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="u1.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="u5.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="l0.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="j7.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="x2.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="g2.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="a8.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="f2.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="h1.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="b3.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="h4.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="v9.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="q3.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="u0.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="o4.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="z1.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="m0.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="d4.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="i5.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="y6.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="r0.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="u6.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="s8.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="k8.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="d0.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="m8.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="q7.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="c2.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="t4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="a7.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="f8.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="l8.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="s0.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="c1.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="w6.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="h0.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="w3.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="w4.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="c8.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="j4.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="x9.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="o8.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="w8.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="m3.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="t3.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="k2.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="s0.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="e7.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="q8.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="n8.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="o7.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="g8.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="c1.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="k0.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="m0.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="s2.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="x0.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="t8.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="f9.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="y3.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="u5.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="q1.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="x2.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="i5.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="r4.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="i2.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="e6.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="r9.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="w4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="c8.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="c3.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="y9.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="b2.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="q5.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="d1.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="k5.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="i9.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="c2.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="v7.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="w0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="q3.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="q9.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="a8.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="f8.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="v2.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="b8.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="w1.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="x6.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="b8.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="v0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="s9.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="j5.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="p4.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="i2.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="c8.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="q7.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="h6.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="o6.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="s4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="v7.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="n8.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="n9.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="m9.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="w1.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="h7.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="u1.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="f9.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="j1.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="o7.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="t6.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="h3.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="i0.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="q4.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="x4.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="o4.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="j8.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="d3.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="l6.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="k3.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="h1.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="m8.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="i2.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="s4.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="h4.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="c7.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="b3.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="d6.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="a6.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="a4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="y0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="k7.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="f0.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="r4.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="v0.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="g4.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="r9.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="d7.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="x2.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="j6.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="e2.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="l0.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="c4.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="m8.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="i0.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="a4.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="a9.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="u8.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="y7.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="d1.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="j1.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="t8.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="g5.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="i2.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="z5.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="y6.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="b1.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="o3.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="f3.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="c8.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="g0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="h7.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="l5.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="y6.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="c3.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="p0.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="c1.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="u4.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="b4.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="l4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="d7.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="m6.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="w0.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="s7.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="r4.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="l5.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="w3.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="t4.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="c7.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="g0.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="c3.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="l2.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="b7.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="k7.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="j2.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="d1.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="j5.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="d9.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="v4.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="t4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="l9.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="p5.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="r6.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="j0.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="k9.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="y7.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="r1.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="x9.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="c0.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="c7.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="h4.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="m9.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="u8.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="q6.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="h5.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="s4.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="v6.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="b7.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="k7.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="f1.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="v0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="d3.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="z3.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="g2.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="h5.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="c1.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="k2.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="i2.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="g2.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="n1.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="m0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="e1.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="e9.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="b6.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="d7.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="a3.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="t2.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="k4.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="e1.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="a2.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="y8.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="c7.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="k8.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="z1.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="o9.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="m9.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="w5.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="r8.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="t5.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="x0.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="t6.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="i5.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="m0.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="u7.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="u6.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="c6.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="n7.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="u2.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="w8.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="s7.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="t3.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="v2.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="p1.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="e0.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="l1.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="x1.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="o0.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="o5.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="v6.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="n9.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="r5.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="r9.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="a5.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="j9.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="g2.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="p0.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="b1.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="t8.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="t0.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="i4.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="h0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="t7.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="m3.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="k3.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="s1.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="h7.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="d9.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="r1.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="x2.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="e8.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="i0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="h2.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="m9.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="e3.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="r2.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="m7.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="q6.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="d3.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="q7.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="d7.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="z0.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="y5.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="y4.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="v7.s1er3.inFO"与 BMP(Bitmap)
C++无宏href="l3.s1lo8.inFO"与 BMP(Bitmap)
C++无宏href="u3.b7de2.inFO"与 BMP(Bitmap)
C++无宏href="r5.b8le2.inFO"与 BMP(Bitmap)
C++无宏href="k3.b7wa3.inFO"与 BMP(Bitmap)
C++无宏href="y8.b7te8.inFO"与 BMP(Bitmap)
C++无宏href="n8.b2ci2.inFO"与 BMP(Bitmap)
C++无宏href="c8.s1en8.inFO"与 BMP(Bitmap)
C++无宏href="x7.b5wa7.inFO"与 BMP(Bitmap)
C++无宏href="b8.b7nv7.inFO"与 BMP(Bitmap)
C++无宏href="t3.s1er3.inFO"与 BMP(Bit

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值