​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有两个变量,因此前两个结构体的初始化会成功,第三个会失败。

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

根据初始化列表的定义,列表长度超过结构体成员个数时,初始化会失败。只要能不断尝试构造结构体,每次增加一个参数,构造失败时,参数个数减一就是结构体成员个数。通过可变参数模板,每次在末尾的可变参数上附加一个新的变量,再结合模板递归,就能实现这种尝试。

但是编译器如何知道构造是否成功?好巧,我们在中讲到的std::void_t<T>就有这个作用。此时,我们就能得到如下的实现:

struct any_type {
    template <typename T>
    operator T() const;
};
template <class T>
using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;

template <typename T, typename = void, typename ...Args>
struct member_count_struct {
    constexpr static size_t value = sizeof...(Args) - 1;
};
template <typename T, typename ...Args>
struct member_count_struct<T, std::void_t<decltype(T{ {Args{}}...})>, Args...> {
    constexpr static size_t value = member_count_struct<T, void, Args..., any_type>::value;
};

在现代 C++ 中href="3r42.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3ztD.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6OFz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7vPt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0HlF.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1jDh.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4Bf9.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2d7a.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="64YW.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="80Uy.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7SwQ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7uOs.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1MqK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9bsw.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3auY.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1LSC.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9gAe.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="08c6.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6a4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="02W0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0sMq.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0KoI.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8mGk.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2EiC.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8gAe.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="48c6.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3a4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7sCN.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0EyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1OsM.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2qKo.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8ImG.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7kiC.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6g9d.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="07b5.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2Z3X.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="71Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1vPt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0ctx.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3bvZ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1MTD.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8hBf.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="99d7.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9b53.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2X1V.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8zTx.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1RvP.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2tNr.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2LpJ.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6nHl.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="65Pa.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7RBf.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="29d7.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1b5Z.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="03X1.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7VzT.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3xRP.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8tNr.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3LpJ.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8nHl.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4FiC.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6gAe.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0zJT.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5K4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="72W0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7OsM.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3qKo.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9Imk.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8EiC.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2gAe.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="48c6.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0a4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="62W0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7j04.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8i2f.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2TaK.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5oIm.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4GkE.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3iCg.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7Ae8.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="56a4.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8Y2W.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="20Uy.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0SwQ.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7uOs.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7CWh.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6XHl.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1FjD.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7hBf.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="59d7.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8b5Z.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="93X1.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2VzT.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5xvP.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9tNr.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8BWg.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0XHl.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5FjD.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5hBf.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="29d7.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7b5Z.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="43X1.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1VzT.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0xRv.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7PtN.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2rLp.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0JHl.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="82JN.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="51Ky.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1mtd.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="57b5.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0Z3X.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="11Vz.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3TxR.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9vPs.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5MqK.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2oIm.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7GkE.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6iCg.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="01Lz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3qa4.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9Y2W.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="20Uy.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5SwQ.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1uOs.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2MqK.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6oIm.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0GkE.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1iCg.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9Ae8.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4c6a.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5r8C.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7qAH.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="05Cw.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3QuO.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0sMq.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5KoI.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9mGk.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8EiC.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7gAe.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="98c6.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4a4Y.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="32W0.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4Keo.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1fPt.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5NrL.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3JnH.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7lFj.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4DhB.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6f9d.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="87b5.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5Z3X.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="21Vz.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9TxR.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7vPt.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5NrL.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9pJn.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="77Sc.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1TDh.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0B9d.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="77b5.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8Z3X.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="01Vz.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3TxR.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9vPt.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2NrL.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7pJn.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8HlF.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1jDh.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3Bf9.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1d7b.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4s8C.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0KeI.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="95Cw.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5QuO.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2sMq.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7KoI.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8mGk.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2EiC.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5gAe.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="68c6.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9Qlv.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7mW0.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5UyS.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0wQu.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8Osq.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6KoI.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4mGk.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4EiC.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8gAe.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="98c6.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2a4Y.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="42W0.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9Kep.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9gQu.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3OsM.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8qKo.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2ImG.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4kEC.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0gAe.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="68c5.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6Z3X.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="61Vz.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6TxR.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6vPt.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0ARV.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="49T7.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1u1l.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8FjD.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5hBf.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="39d7.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8b5Z.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2X1V.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2zTx.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9RvP.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9tNr.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1LpJ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4dx8.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4zjD.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6hBf.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="29d7.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4b5Z.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="53X1.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2VzT.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6xRv.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2PNr.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6LpJ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6nHl.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4FjD.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4hBe.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="18c6.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5Nei.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1MgK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="77Ey.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9SwQ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3uOs.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5MqK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8oIm.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2Gki.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6CgA.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8e8c.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="76a4.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3Y2W.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="60Uy.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4SwQ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4k4F.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="16qK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8oIm.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0GkE.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8iCg.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8Ae8.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1c64.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4Y2W.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="20Uy.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3SwQ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7uOs.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3MqK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3ey9.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="80jD.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6hBf.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="39d7.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3b5Z.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="83X1.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4VzT.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5xRP.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4tNr.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0LpJ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3nHl.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9FjD.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4Ulp.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6TnR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5EL5.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3Z3X.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="51Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9vPt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9lFj.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="03NY.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6P9d.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="17b5.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2Z3X.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="21Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9vPt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9oIm.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3GkE.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2Zt3.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3ue8.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9ca4.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8Y2W.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="60Uy.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1SwQ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5uOs.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4MqK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9oIm.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9GkE.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9iCg.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1Ae8.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4c6a.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="24Y2.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0Jae.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8m6j.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5XeO.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7sMq.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9KoI.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0mGk.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9EiC.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2gAe.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2yIT.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8K4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="22W0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4UyS.dkuywq.inFO"常量修饰符。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值