C++类模板的特化(三)

这篇具有很好参考价值的文章主要介绍了C++类模板的特化(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要介绍类模板的特化、局部特化和缺省模板实参;

1.类模板的特化

类模板的特化(Class Template Specialization)是指为特定的模板参数提供自定义实现的过程。通过特化,我们可以针对某些特定的类型或条件提供不同的行为或实现;

如果需要特化一个类模板,需要特化该模板中的所有成员函数;

模板的特化注意事项:
需要将模板写成template <>,并且需要指明特定的类型,下面示例需要特化std::string的类型,成员函数按照正常的函数实现即可

template <>
class Stack <std::string>
{}

示例

/*
 * @brief: class complates
 * @complie: g++ -g *.cc -o d -std=c++11
 * @autor: your name
 * @date: 2023/08/22
 */

#include <iostream>
#include <vector>
#include <stdexcept>

template <class T>
class Stack 
{
private:
    std::vector<T> elems;

public:
    void push(T const&);
    void pop();
    T top() const;
    bool empty() const
    {
        return elems.empty();
    }    
    int32_t getElemsSize() const
    {
        std::cout<<"not string size"<<std::endl;
        return elems.size();
    }
};

template <typename T>
void Stack<T>::push(T const& elem)
{
    elems.push_back(elem);
}

template <typename T>
void Stack<T>::pop()
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    elems.pop_back();
}

template <typename T>
T Stack<T>::top() const
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    return elems.back();
}


//std::string
template <>
class Stack <std::string>
{
private:
    std::vector<std::string> elems;

public:
    void push(std::string const&);
    void pop();
    std::string top() const;
    bool empty() const
    {
        return elems.empty();
    }    
    int32_t getElemsSize() const
    {
        std::cout<<"string size"<<std::endl;
        return elems.size();
    }
};

void Stack<std::string>::push(std::string const& elem)
{
    elems.push_back(elem);
}

void Stack<std::string>::pop()
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    elems.pop_back();
}

std::string Stack<std::string>::top() const
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    return elems.back();
}

int main(int argc, char* argv[])
{
    Stack<int> int_stack;
    int_stack.push(10);
    int_stack.push(20);
    int_stack.push(30);
    std::cout<<int_stack.getElemsSize()<<std::endl;

    //std::string
    Stack<std::string> string_stack;
    string_stack.push("class");
    string_stack.push("int");
    string_stack.push("int64");
    string_stack.push("double");
    string_stack.push("float");
    std::cout<<string_stack.getElemsSize()<<std::endl;


    return 0;
}

2. 类模板的局部特化

类模板的局部特化(Partial Class Template Specialization)是指针对模板参数的部分特化,只针对某些特定的条件进行自定义实现的过程。通过局部特化,我们可以为满足特定条件的模板参数提供不同的实现。

示例

/*
 * @brief: class complates
 * @complie: g++ -g *.cc -o d -std=c++11
 * @autor: your name
 * @date: 2023/08/22
 */

#include <iostream>
#include <vector>
#include <stdexcept>
#include <string>

//局部特化
template <typename T, typename U>
class MyClass
{
public:
    void print() const
    {
        std::cout<<"typename and typename"<<std::endl;
    }
};

template <typename T>
class MyClass<T, std::string>
{
public:
    void print() const
    {
        std::cout<<"typename and string"<<std::endl;
    }
};

template <typename T>
class MyClass<T, double>
{
public:
    void print() const
    {
        std::cout<<"typename and double"<<std::endl;
    }
};



int main(int argc, char* argv[])
{
    MyClass<int, int> int_myclass;
    int_myclass.print();

    MyClass<int, std::string> string_myclass;
    string_myclass.print();

    MyClass<int, double> double_myclass;
    double_myclass.print();

    return 0;
}

输出

typename and typename
typename and string
typename and double

3. 缺省模版实参

在函数模板的时候,可以将模板的参数定位为缺省值;即支持默认,也支持指定,使用起来更加的方便;

示例

/*
 * @brief: class complates
 * @complie: g++ -g *.cc -o d -std=c++11
 * @autor: your name
 * @date: 2023/08/22
 */

#include <iostream>
#include <vector>
#include <deque>
#include <stdexcept>
#include <string>

//缺省模版参数
template <typename T, typename CONT = std::vector<T>>
class Stack 
{
private:
    CONT elems;

public:
    void push(T const&);
    void pop();
    T top() const;
    bool empty() const
    {
        return elems.empty();
    }    
    int32_t getElemsSize() const
    {        
        return elems.size();
    }
};

template <typename T, typename CONT>
void Stack<T, CONT>::push(T const& elem)
{
    elems.push_back(elem);
}

template <typename T, typename CONT>
void Stack<T, CONT>::pop()
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    elems.pop_back();
}

template <typename T, typename CONT>
T Stack<T, CONT>::top() const
{
    if(elems.empty()) 
    {
        throw std::out_of_range("empty stack");
    }
    return elems.back();
}


int main(int argc, char* argv[])
{
    //使用默认值
    Stack<int> int_stack;
    int_stack.push(10);
    int_stack.push(20);
    int_stack.push(30);
    std::cout<<int_stack.top()<<std::endl;

    //赋值类型
    Stack<double, std::deque<double>> double_stack;
    double_stack.push(10.11);
    double_stack.push(20.22);
    double_stack.push(30.33);
    std::cout<<double_stack.top()<<std::endl;

    return 0;
}

输出文章来源地址https://www.toymoban.com/news/detail-666781.html

30
30.33

到了这里,关于C++类模板的特化(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】模板进阶--非类型模板参数&&模板特化及分离编译

    模板参数分为 类型形参 与 非类型形参 ,其中,类型形参即出现在模板参数列表中,跟在class或者typename之类的参数类型名称,非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用 我们以定义一个静态的数组为例,在没有非

    2023年04月23日
    浏览(44)
  • 【C++】模板进阶—非类型模板参数、模板特化及模板的分离编译

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C++  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同

    2024年02月16日
    浏览(36)
  • 【C++学习】模板进阶——非类型模板参数 | 模板的特化 | 分离编译

    🐱作者:一只大喵咪1201 🐱专栏:《C++学习》 🔥格言: 你只管努力,剩下的交给时间! 模板我们之前一直都在使用,尤其是在模拟STL容器的时候,可以说,模板给类增加了更多的可能性,是C++最重要的部分之一。下面本喵来更深入的讲解一下模板。 在上面代码中,创建了

    2023年04月13日
    浏览(35)
  • 【C++初阶(十)】C++模板(进阶) ---非类型模板参数、模板的特化以及模板的分离编译

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 模板参数可分为类型形参和非类型形参。 类型形

    2024年01月18日
    浏览(36)
  • C#模拟C++模板特化对类型的值的支持

    C++的模板相比于C#的泛型,有很多地方都更加的灵活(虽然代价是降低了编译速度),比如C++支持变长参数模板、支持枚举、int等类型的值作为模板参数。 C++支持枚举、int等类型的值作为模板参数,为C++的静态多态编程提供了很好的帮助,比如根据枚举值编译期确定某个对象

    2023年04月17日
    浏览(37)
  • 模板特化的多维度挖掘

       假如我有一个需求,就是如果传入的参数是int类型,我就输出int类型,否则就输出T。很显然,根据模板的基础知识,我们可以这么写    除了这样写,还有别的写法吗。我们可以思考一下.................这里我们其实可以用std::enable_if_t来实现,它相当于给std::enable_if的

    2024年02月08日
    浏览(36)
  • 【高级程序设计语言C++】初识模板

    概念: 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 具体格式: templatetypename T1, typename T2,…,typename Tn 返回值类型 函数名(参数列表){} 输出结果: typename是用来定义模板参数,也可以使用class(切记

    2024年02月15日
    浏览(42)
  • [C++开发 03 _ 模板(167)]

    1.1模板的概念  模板的特点: 模板不可以直接使用,它只是一个框架 模板的通用并不是万能的 1.2函数模板 1.2.1函数模板语法 函数模板的引入: 函数模板的举例:  总结: 函数模板利用template 使用函数模板有两种方式:1、自动类型推导     2、显示指定类型 模板的

    2024年01月20日
    浏览(37)
  • 【C++算法模板】图论-拓扑排序,超详细注释带例题

    推荐视频链接:D01 拓扑排序 给定一张 有向无环图 ,排出所有顶点的一个序列 A A A 满足:对于图中的每条有向边 ( x , y ) (x,y) ( x , y ) , x x x 在 A A A 中都出现在 y y y 之前,则称 A A A 是该图的顶点的一个拓扑序 拓扑排序 可以判断有向图中是否有环,可以生成拓扑序列 对于下

    2024年04月15日
    浏览(40)
  • C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月25日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包