​C++无宏静态反射全解析不需要修改结构体asssa

最终可以达到这种效果:

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="21Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5vPN.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4rLp.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0JnH.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6lFj.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1DhB.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2f9d.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="17b5.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6Z3X.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="51Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8l5G.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="17rL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6Hlj.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9DhB.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6f9d.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="87b5.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5Z3X.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="31Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0vPt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4pIm.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8GkE.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0iCg.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6Ae8.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9c64.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1Y2W.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1rBL.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3CwQ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7uOs.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3MqK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6oIm.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5GkE.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3iCg.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8Ae8.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2c6a.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="14Y2.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8W0U.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4ySQ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3uOs.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1MqK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4bsw.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3auX.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8LSC.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0gAe.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="98c6.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7a4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="82W0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4HFj.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5DhB.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9f9d.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="87b5.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6Z3X.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="21Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1l6G.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="67rL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2HlF.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9jDh.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5Bf9.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7db5.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3Z3X.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="81Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5vPt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2HlF.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1jDh.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2Bf9.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0d7b.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="85Z3.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7Nhs.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9DxQ.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1uOs.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8MqK.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5oIm.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3GkE.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8iCg.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1Ae8.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9c6a.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="84Y2.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5W0U.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1ySw.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9QuO.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8sMq.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5KIm.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2GkE.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7iCg.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3Ae8.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5Pgk.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3OiL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="29G0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3OsM.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5qKo.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0ImG.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3kEi.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7Cge.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="38c6.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2a4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="32Vz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0vPt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7HlF.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1au4.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1vf9.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9d7b.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="25Z3.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7X1V.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7TxR.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1vPt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6NrL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0HlF.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7jDh.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1Bf9.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7d7b.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="45Z3.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6X1V.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7zTx.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2EVZ.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7DWA.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6SZJ.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4nHl.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7FjD.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2hBf.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="39d7.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9a4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="12W0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3OsM.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9qKo.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1ImG.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3kEi.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2CAe.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5yJT.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6K4Y.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="72W0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6OsM.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4qKo.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7ImG.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9kEi.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3CgA.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8e8c.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="26a4.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0YW0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2OsM.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5g0B.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="32mG.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5kEi.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8Cg9.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3d7b.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="75Z3.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9X1V.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4zTx.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9RvP.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6trL.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0pJn.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1HlF.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4jDh.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4Bf9.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4d7b.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="85Z3.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1Kbf.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8JdH.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="44Bv.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8PtN.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1rLp.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8JnH.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9lFD.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8hBf.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="59d7.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5b5Z.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="33X1.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4VzT.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3xRv.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3PtN.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2rLp.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5JnH.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8bv5.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4wgA.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9e8c.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="66a4.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="82W0.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3UyS.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8wQu.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5OsM.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0qKo.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3ImG.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4kEi.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3CgA.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6Upz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2qa4.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7Y2W.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="60Uy.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6SwQ.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1OsM.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0qKo.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4ImG.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1kEi.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3CgA.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="2e8c.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="66a4.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7Y2W.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="70Uy.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6FWa.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0DXB.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5z6q.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0JnH.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6ljD.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2hBf.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="69d7.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5b5Z.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="73X1.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2VzT.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7xRv.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1PtN.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4rLp.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4JnH.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3bw6.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5xhB.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4f9d.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="975Z.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="03X1.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6VzT.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1xRv.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4PtN.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1rLp.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3JnH.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0Ypt.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8XqU.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="0IP9.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5d7b.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="75Z3.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7X1V.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9zTR.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1vPt.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="4MqK.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0oIm.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9GkE.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0iCg.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="61LV.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8M6a.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="14Y2.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2W0U.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5ySw.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="2QuO.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6sMq.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6KoI.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9GkE.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1iCg.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="40KV.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0M6a.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="54Y2.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3W0U.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1ySw.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="3QuO.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6sMq.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1KoI.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9mGk.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7EiC.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8gAe.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="7c6a.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="34Y2.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1W0U.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="5yRv.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="6PtN.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1evz.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="0dxb.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="6OVF.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1jDh.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="7Bf9.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5d7b.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="95Z3.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4X1V.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8zxR.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="8vPt.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="9NrL.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9pJn.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3HlF.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="4jDh.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="8Bf9.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="9d7b.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="15Z3.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="1X1V.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="3p9K.gxbeyc.inFO"常量修饰符。
在现代 C++ 中href="5BvP.dkuywq.inFO"常量修饰符。
在现代 C++ 中href="1tNr.gxbeyc.inFO"常量修饰符。
在现代 C

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值