C++基础#13:模板在C++中的使用,Template

Cppfront与Cpp2:探索下一代C++语法,提升代码安全性与简洁性 在C++编程中,语法安全性和代码简洁性一直是开发者关注的核心议题。传统C++由于历史包袱,存在未初始化变量、空指针解引用等常见隐患,增加了代码维护的复杂性和错误风险。通过引入更现代的语言设计理念,如默认安全初始化、非空指针类型和统一函数声明语法,可以从根本上消除这些错误源头,提升代码的可靠性和可读性。这些改进不仅符合现代软件工程对安全性和可维护性的要求,也为大型项目开发和团队协作提供了更好的基础。Cppfront作为实验性编译器前端,正是这一理念的实践工具,它通过Cpp2语法探索了如何在不破坏现有生态的前提 阅读详情

 所谓模板是一种使用无类型参数来产生一系列函数或类的机制,是C++的一个重要特性。模板使程序员能够快速建立具有类型安全的类库集合和函数集合,它的实现方便了更大规模的软件开发。
模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个单独的类或函数。

例如,设计一个求两参数最大值的函数,不使用模板时,需要定义四个函数:

int max(int a,int b){return(a>b)?a:b;}
long max(long a,long b){return(a>b)?a:b;}
double max(double a,double b){return(a>b)?a:b;}
char max(char a,char b){return(a>b)?a:b;}


若使用模板,则只定义一个函数:

Template<class type>type max(type a,type b)
{return(a>b)?a:b;}

在C++中,有两种模板,一种是函数模板,一种是类模板。


一. 函数模板:
1. 函数模板的一般说明形式如下:

template <模板形参表>
<返回值类型> <函数名>(模板函数形参表)
{
 //函数定义体
}
其中, template 是一个声明模板的关键字。<模板形参表>可以包含基本数据类型,也可以包含类类型。类型形参需要加前缀class。如果类型形参多于一个,则每个类型形参都要使用class。<模板函数形参表>中的参数必须是惟一的,而且在<函数定义体>中至少出现一次。
函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行。
当编译系统发现有一个函数调用:
<函数名>(<实参表>);
时,将根据<实参表>中的类型生成一个重载函数即模板函数。该模板函数的定义体与函数模板的函数定义体相同,而<形参表>的类型则以<实参表>的实际类型为依据。

2.函数模板注意事项:
(1)函数模板也可以定义static,extern,inline函数,如,
    

templete <class T> inline T max(T a, T b) {...}
templete <class T> static T sum(T *array, int size = 0) {...}


(2)函数模板也可以像一般函数一样进行重载。一般来说,函数模板和重载函数各自的使用场景不同,比较如下:
    重载函数适用于:函数名相同,算法亦相同,但参数个数或类型不同;
    函数模板适用于:函数名相同,算法亦相同,参数个数亦相同,但类型不同。
(3) 函数模板举例:

/* 例1:templeteTest1.cpp   */
/* IDE环境: Dev-C++ 4.9.9.2 */
/* 函数模板举例 */

/* 说明: 对具有n个元素的数组a[ ]求最小值,求最小值的函数设计成函数模板。*/

#include <stdio.h>
template <class T>
T min(T a[],int n)
{
 int i;
 T minv=a[0];
 for(i=1;i<n;i++)
      if(minv>a[i])
         minv=a[i];
 return minv;
}

int main()
{
    int a[] =    {1, 3, 0, 2, 7, 6, 4, 5, 2 };
    double b[] = {1.2, -3.4, 6.8, 9.8 };
    
    printf("min of a:%d /n", min(a,9));
    printf("min of b:%f /n", min(b,4));
   
   while(1);
   return 0;
}



运行结果:

/* result:
          min of a:0
          min of b:-3.400000

*/

例2:对于给定类型的两个变量,输出较大的一个
 

/* 例2:templeteTest2.cpp   */
/* IDE环境: Dev-C++ 4.9.9.2 */
/* 重载模板函数举例 */

/* 说明: 对于给定类型的两个变量,输出较大的一个。*/


#include<stdio.h>
#include<string.h>



template <class type>type max(type a,type b)
{
 return(a>b)?a:b;
};



char* max(char* a,char* b)
{
 return(strcmp(a,b)>0?a:b);
};



static char *name[] = {"zhang", "wang","li","zhao"};


int main()
{
   
     printf("100 and 9, max value is  :%d /n", max(100,9));            // 100
    printf("3.14 and 0.618, max is : %f /n/n", max(3.14, 0.618));      // 3.140000
   
     for (int i = 0; i<4; i++)
     {
         printf("address of name[%d] is %p /n", i,&name[i]);
     }
     printf("/n");
   
    printf("the max of %s and %s is: %s /n", name[0], name[1], max(name[0], name[1]) );   // zhang
    printf("the max of %s and %s is: %s /n", name[2], name[3], max(name[2], name[3]) );   // zhao
   
    while(1);
    return 0;
}

运行结果:

/* result:
          100 and 9, max value is  :100
          3.14 and 0.618, max is : 3.140000
         
          address of name[0] is 00402000
          address of name[1] is 00402004
          address of name[2] is 00402008
          address of name[3] is 0040200C
              
          the max of zhang and wang is: zhang 
          the max of li and zhao is: zhao

*/ 

在上面的例子中,对于模板函数max来说,当参数为字符串时,则类型参数type被编译器解释成 char *, 模板函数max则被解释成:
char *max(char *a, char *b)
{
     return (a>b)?a:b;
}
这里,实际进行比较的是a,b的地址,由于b 定义在a之后,所以b比a 的地址高。

为了解决这种"没有真正比较字符串"的问题,定义了一个非模板函数max,通过调用strcmp去真正地进行字符串的比较。


编译器会优先选择一般函数,即非模板函数。 

二. 类模板:


对象是类的特例,类又可以看作是类模板的特例。类模板又称类属类或类发生器,它们与函数模板有同样的应用目的。
 
1. 类模板说明:
类模板说明的一般形式是:

// 接口定义
template  <类型形参表>
class  <类名>
{
 //类说明体
};

// 接口实现
template  <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数1>(形参表)
{
 //成员函数定义体
}
template  <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数2>(形参表)
{
 //成员函数定义体
}

template  <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数n>(形参表)
{
 //成员函数定义体
}

2. 使用类模板:
   (1)使用:与函数模板一样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。
        建立类模板之后,可用下列方式创建类模板的实例:
        <类名> <类型实参表> <对象>;
        其中,<类型实参表>应与该类模板中的<类型形参表>匹配。<类型实参表>是模板类(template class),<对象>是定义该模板类的一个对象。
    
   (2)类模板与函数模板的不同:
        a. 对由函数模板生成的模板函数的调用是由编译器自动决定的,
           而对类模板的解释由程序设计者自行指明。
        b. 格式定义上也有许多不同。


   (3)类模板举例:

/* 例3:class_templeteTest1.cpp   */
/* IDE环境: Dev-C++ 4.9.9.2 */

/* 说明: 对两个任意类型的数求和。*/

#include <stdio.h>

template<class T>
class A
{
public:
    A();
    A(T _a,T _b);
    T sum();
private:
    T a;
    T b;
};

template <class T>
A<T>::A()
{
    a=0;b=0;
}

template<class T>
A<T>::A(T _a,T _b)
{
    a=_a;b=_b;
}

template<class T>
T A<T>::sum()
{
    return (a+b);
}
 
int main()
{
    A<int> ai(3,4);
    A<double> ad(3.1,4.0);
   
    printf("ai.sum() = %d /n", ai.sum());
    printf("ad.sum() = %f /n", ad.sum());
   
    while(1);
    return 0;
}

运行结果:


/* result:
          ai.sum() = 7
          ad.sum() = 7.100000
*/

例4:一个类属向量类的实现

/* 例4:class_templeteTest2.cpp   */
/* IDE环境: Dev-C++ 4.9.9.2 */

/* 说明: 一个类属向量类的实现*/ 



#include <stdio.h>

const int ARRAY_SIZE = 20;

// 接口定义
template<class T>
class Array
{
public:
    Array( const int size);
    ~Array();
    T &operator[](const int index);
    void operator =(T temp);
private:
    T *element;
    int size;
};

//接口实现
template<class T> inline
Array<T>::Array( const int s )
{
    size = s;
    element = new T[size];
    for (int i = 0; i < size; i++ )
        element[i] = 0;
}

template<class T> inline
Array<T>::~Array()
{
    delete element;
}

template<class T>
T &Array<T>::operator[](const int index )
{
    return element[index];
}

template<class T>
void Array<T>::operator=(T temp )
{
    for (int i = 0; i < size; i++ )
        element[i] = temp;
}


 
int main()
{
    Array<int> Iobj(ARRAY_SIZE);
    Array<double> Dobj(ARRAY_SIZE);
    Array<char> Cobj(ARRAY_SIZE);
   
    for (int i = 0; i < ARRAY_SIZE; i++ )
    {
        Iobj[i] = i;
        Dobj[i] = i;
    }
    Cobj = 'C';
    for (int i = 0; i < ARRAY_SIZE; i++ )
    {
        printf("Iobj[%d] = %4d        ", i, Iobj[i]);
        printf("Dobj[%d] = %12f       ", i, Dobj[i]);
        printf("Cobj[%d] = %c         ", i, Cobj[i]);
        printf("/n");
    }

   
    while(1);
    return 0;
}

运行结果:

/*
test result:
    Iobj[0] = 0          Dobj[0] = 0.000000       Cobj[0] = C        
    Iobj[1] = 1          Dobj[1] = 1.000000       Cobj[1] = C        
    Iobj[2] = 2          Dobj[2] = 2.000000       Cobj[2] = C        
    Iobj[3] = 3          Dobj[3] = 3.000000       Cobj[3] = C        
    Iobj[4] = 4          Dobj[4] = 4.000000       Cobj[4] = C        
    Iobj[5] = 5          Dobj[5] = 5.000000       Cobj[5] = C        
    Iobj[6] = 6          Dobj[6] = 6.000000       Cobj[6] = C        
    Iobj[7] = 7          Dobj[7] = 7.000000       Cobj[7] = C        
    Iobj[8] = 8          Dobj[8] = 8.000000       Cobj[8] = C        
    Iobj[9] = 9          Dobj[9] = 9.000000       Cobj[9] = C        
    Iobj[10] = 10         Dobj[10] = 10.000000      Cobj[10] = C        
    Iobj[11] = 11         Dobj[11] = 11.000000      Cobj[11] = C        
    Iobj[12] = 12         Dobj[12] = 12.000000      Cobj[12] = C        
    Iobj[13] = 13         Dobj[13] = 13.000000      Cobj[13] = C        
    Iobj[14] = 14         Dobj[14] = 14.000000      Cobj[14] = C        
    Iobj[15] = 15         Dobj[15] = 15.000000      Cobj[15] = C        
    Iobj[16] = 16         Dobj[16] = 16.000000      Cobj[16] = C        
    Iobj[17] = 17         Dobj[17] = 17.000000      Cobj[17] = C        
    Iobj[18] = 18         Dobj[18] = 18.000000      Cobj[18] = C        
    Iobj[19] = 19         Dobj[19] = 19.000000      Cobj[19] = C        
    
*/


Vicuna-13B本地部署实战:llama.cpp+FastAPI轻量级生产方案 大语言模型(LLM)本地化部署正成为企业AI落地的关键路径,其核心在于平衡推理性能、硬件兼容性与工程可控性。基于llama.cpp的GGUF量化技术可将13B级模型压缩至5GB以内,实现CPU端稳定推理;FastAPI与Uvicorn组合则提供高并发、自文档化的RESTful接口能力。该方案规避了PyTorch显存瓶颈、Ollama黑盒封装及Flask GIL限制,特别适合知识库问答、智能客服、技术文档摘要等中低延迟业务场景。本文聚焦Vicuna-13B在消费级设备(如M1 Mac)上的端到端部署,涵盖4- 阅读详情

相关推荐

MinkowskiEngine CUDA 13.0安装指南:解决libcudart.so.13兼容与C++17编译问题

稀疏卷积是三维点云处理的核心技术,其底层依赖高效、版本对齐的CUDA运行时与C++标准支持。MinkowskiEngine作为主流稀疏张量计算库,其编译原理涉及CUDA运行时链接、PyTorch C++ ABI匹配及编译器标准协同三大机制。技术价值在于保障稀疏体素卷积在新一代GPU(如RTX 4090/A100)上的正确性与性能;典型应用场景涵盖LiDAR语义分割、自动驾驶感知模型训练及多模态3D重建。当系统升级至CUDA 13.0后,因预编译wheel硬依赖libcudart.so.12且不支持C++17

weixin_30753873的博客 396

C++ template 模板详解

在这里,type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。其中template和class是关键字,class可以用typename 关键字代替,在这里typename 和class没区别,括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。模板形参需要调用该模板函数时提供的模板实参来初始化模板形参...

BadSheepC 3181

C++20 Concepts入门与实践:提升模板编程效率

C++模板元编程是泛型编程的核心技术,但复杂的模板错误信息常令开发者困扰。C++20引入的Concepts特性通过编译期约束机制,从根本上改善了这一问题。Concepts作为模板参数的语义约束条件,能够明确指定类型必须满足的接口要求,其原理类似于为函数参数添加类型声明。这项技术显著提升了代码健壮性,在图形渲染、网络通信等需要高度抽象的场景中尤为重要。通过定义Printable、Serializable等概念,开发者可以构建更安全的泛型接口,同时获得更清晰的编译错误信息。标准库提供的std::same_as、

weixin_33804582的博客 455

C++编程语言中模板(template)介绍

泛型编程是一种代码编写方式,通过使用泛型编程,可以编写出独立于任何特定类型的代码。模板是泛型编程的基础,是创建泛型函数或类的蓝图(公式)。C++的STL(Standard Template Library)容器及其迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如vector,我们可以定义许多包含不同类型元素的vector,比如:“vector ”或“vector ”。C++的模板包括函数模板和类模板。

liitdar的博客 8962

同花顺客户端数据采集:Hook注入与内存解密实战

在金融量化领域,客户端数据采集是获取低延迟、高精度行情的关键技术路径。其底层涉及进程通信、内存加密、反调试等典型Windows逆向工程问题。理解API Hook原理与AES-CBC动态密钥派生机制,有助于突破传统HTTP爬虫在国产金融软件中的失效困境。该技术不依赖网络劫持,而聚焦于本地进程内函数拦截与运行时内存解析,具备离线、可控、合规等工程优势,广泛应用于Level2行情、逐笔委托、分笔成交等高频数据场景,是量化基础设施中‘端侧数据主权’的重要实现方式。

weixin_30496999的博客 855

MCGS 昆仑通态触摸屏 modbus TCP 数据转发

MCGS触摸屏数据转发modbus TCP数据转发

m0_63451859的博客 2万+

C++中 无参数函数模板使用

头文件中定义: template&lt;class ia_t&gt; T_bool isIgmpV3MultSrcSupported(); template &lt;&gt; T_bool isIgmpV3MultSrcSupported&lt;ia4_t&gt;(); template &lt;&gt; T_bool isIgmpV3MultSrcSupported&lt;ia6_t&gt;(...

liangds的专栏 3551

ROS相机内参标定详细步骤指南

相机标定的目的是为了确定相机内部参数和外部参数,以便修正图像并将图像坐标映射到世界坐标,或者从世界坐标映射到图像坐标。这个过程是计算机视觉和三维感知任务的关键步骤之一,它有以下主要目的: 1. **减小畸变**:相机镜头和传感器可能引入径向和切向畸变,使得图像中的直线变得弯曲或者物体的形状不准确。通过标定相机,可以矫正这些畸变,使图像更准确。

m0_56661101的博客 1万+

C++ 类模板与无类型参数

使用无参数类型的类模板 #include using namespace std; template class A { T *p; public: A(T* q) { p = new T[size]; for(int i=0;i<size;i++) p[i] = *q++; } void disp() { int i; for(i=0

3048

保姆级教程:在CentOS 8上用libvirt + QEMU/KVM搭建ARM64虚拟机(含UEFI配置与常见坑点)

本文提供在CentOS 8上使用libvirt + QEMU/KVM搭建ARM64虚拟机的详细教程,涵盖UEFI配置与常见问题解决方案。通过环境准备、特殊配置要点、UEFI固件安装等步骤,帮助用户在x86架构服务器上高效运行ARM64虚拟化环境,特别适合开发测试与跨平台应用场景。

weixin_30292745的博客 130

【图像去噪】论文精读:FM2S: Self-Supervised Fluorescence Microscopy Denoising With Single Noisy Image

论文题目:FM2S: Self-Supervised Fluorescence Microscopy Denoising With Single Noisy Image —— FM2S:单噪声图像自监督荧光显微镜去噪arXiv 2024!显微图像去噪!通过可视化详细的细胞结构和生物过程,荧光显微镜具有显着先进的生物学研究。然而,由于难以精确建模固有噪声和获取干净图像进行训练,这种图像去噪任务往往面临挑战,这限制了大多数现有方法。在本文中,我们提出了一种有效的。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 408

[ C++ ] template 模板进阶 (特化,分离编译)

本篇内容包括C++ 非典型模板参数,类模板的特化,模板的分离编译。

优快云博客 2221

CloudCompare 二次开发(9)——半径滤波

基于PCL对CloudCompare软件进行二次开发,实现的算法功能是半径滤波

点云侠的博客 1400

6.C++的模板【由浅入深-C++】

本文介绍C++模板的相关内容。

插花弄玉的博客 1346

工业级4~20mA转0~3V信号调理电路原理图设计,已量产(电流传感器)

在工业现场,4~20mA 电流信号是模拟量传输的 “老熟人”—— 抗干扰强、能跑长距离,但嵌入式 MCU 的 ADC 一般只认电压信号。最近做项目时,我设计了一款能覆盖 0~25mA(含超量程冗余)、线性输出 0~3V 的调理电路,经过现场调试挺稳定,分享下细节。

不脱发的程序猿 525

【uni-app】PDA扫码枪获取扫码数据APP(通俗易懂),聚焦频繁弹软键盘输入法等各种坑完美解决方法,附完整代码

uniapp PDA扫码枪获取扫码数据APP(通俗易懂),频繁弹软键盘等各种坑完美解决方法

coderYYY的博客 7418

《C++ Primer Plus》模板类 Template 课本实验

这两个实验何在了一起,使用了类模板的非类型参数(表达式参数),并且使用递归模板定义了 ArrayTP<ArrayTP<int, 5>, 10> twodee,基于模板的迭代,twodee 是一个报了10个元素的数组,每个元素都是一个包含了5个int元素的数组。《C++ Primer Plus》 cpp 14.15 实验,正确的使用 'const char *' 作为类型参数来实例化模板类。《C++ Primer Plus》模板类 Template 课本实验,这里是抄写图书上的代码作为备忘测试。

小狗爱吃黄桃罐头的博客 194

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

第二十五节 C++ 模板、预处理

第二十五节 C++ 模板、预处理

2501_92886572的博客 854

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Embedded Template Library:嵌入式C++模板库的确定性内存管理解决方案

在资源受限的嵌入式系统开发中,动态内存分配往往成为实时性和可靠性的瓶颈。Embedded Template Library(ETL)通过零动态内存分配、编译时容量确定和STL兼容API三大核心特性,为嵌入式C++开发者提供了确定性的内存管理解决方案,解决了嵌入式环境下标准模板库(STL)无法满足的严格实时性需求。 ## 项目定位与核心理念 ETL的设计哲学源于嵌入式系统的特殊约束:内存有限、实

gitblog_00233的博客 439

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++ Template的模板的模板参数

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

s_c_p的博客 1541

C++模板、模板引入STL

STL只是C++标准库的一部分,STL主要包括数据结构和算法!为什么要和模板放在一起呢?因为STL就像一个模板,有了STL我们就不需要自己受挫链表、栈、堆等了!!

qq_57425280的博客 615

【C++】template方法undefined reference to(二):C++代码的编译过程

接着上一篇文章讲,为什么单文件会编译失败。一个c/c++文件要经过才能变成可执行文件。接下来,我们用 gcc(g++) 完成这个过程。

矢车菊二十七号 1158

C++模板参数推导:原理、应用与优化实践

模板参数推导是C++泛型编程的核心机制,编译器根据函数调用时的实参类型自动确定模板参数类型。这一特性从C++98到现代标准不断演进,与auto、decltype等特性协同工作,显著提升了代码的简洁性和类型安全性。在工程实践中,模板参数推导广泛应用于完美转发、类型萃取和变参模板等场景,同时需要关注编译期计算优化和代码膨胀控制。通过结合概念约束(C++20)和编译期if等新特性,开发者可以构建更健壮、高效的泛型代码。理解参数推导规则对于设计标准库级别的泛型接口至关重要,特别是在高性能计算和基础架构开发中。

weixin_34409357的博客 422

C++ template

#参考yanxiangtianji 的博客 1,模板参数包(template parameter pack): 它指模板参数位置上的变长参数(可以是类型参数,也可以是非类型参数) 2,函数参数包(function parameter pack): 它指函数参数位置上的变长参数 1参数包: 1 #include <iostream> 2 #include &l...

weixin_30892763的博客 163

C++标准模板库(Standard Template Library)

# 标准模板库(Standard Template Library) STL的代码从广义上讲分为三类: - container(容器): 包含、放置数据的地方。 - iterator(迭代器): 在容器中指出一个位置、或成对使用以划定一个区域,用来限定操作所涉及到的数据范围。 - algorithm(算法): 要执行的操作 几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和...

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 488

理解c++ template 函数

这个函数可是很有意思啊 全部的应该是template< class T > inline T const & max( T const & a, T const & b )吧! 首先这是一个函数模板,作用是比较 T类型的两个变量 a b,的大小! inline 表示这是一个内联函数作用你就自己查吧!这个挺重要的哦! 我重点说后面的const 先要知道被const...

fsspringalex的博客 352
上一篇: C++基础#17:C++中的虚函数表
下一篇: C语言中的回调函数-根据时间差来调用回调函数,获取时间函数time
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值