栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++函数模板特化,类模板特化

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++函数模板特化,类模板特化

一、模版与特化的概念 1. 函数模版与类模版

C++中模板分为函数模板和类模板

  • 函数模板:是一种抽象函数定义,它代表一类同构函数。
  • 类模板:是一种更高层次的抽象的类定义。
2. 特化的概念

所谓特化,就是将泛型的东西搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。

二、 模板特化的分类

针对特化的对象不同,分为两类:函数模板的特化和类模板的特化

1. 函数模板的特化

当函数模板需要对某些类型进行特化处理,称为函数模板的特化。

2. 类模板的特化

当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

3. 特化整体上分为全特化和偏特化

(1)全特化

就是模板中模板参数全被指定为确定的类型。

全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样。

(2)偏特化

就是模板中的模板参数没有被全部确定,需要编译器在编译时进行确定。

全特化的标志就是产生出完全确定的东西,而不是还需要在编译期间去搜寻适合的特化实现,貌似在我的这种理解下,全特化的 东西不论是类还是函数都有这样的特点

(3)两者的差别

模板函数只能全特化,没有偏特化(以后可能有)。

模板类是可以全特化和偏特化的。

全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义
偏特化的标志:template

函数模版特化:目前的标准中,模板函数只能全特化,没有偏特化

至于为什么函数不能偏特化,似乎不是因为语言实现不了,而是因为偏特化的功能可以通过函数的重载完成。

三、示例代码 1. 函数模板的特化
#include 
#include 

//	函数模板
template 
int compare(const T left, const T right)
{
    std::cout <<"in template..." <
int compare(const char* left, const char* right)
{
    std::cout <<"in special template< >..." <
    std::cout <<"in overload function..." <
    compare(1, 4);

    const char *left = "abcdef";
    const char *right = "wild_wolf";
    compare(left, right);

    return 0;
}
2. 类模板的特化:与函数模板类似,当类模板内需要对某些类型进行特别处理时,使用类模板的特化。
#include 
#include 
#include 
#include"tt.h"
// general version
template
class Compare
{
public:
    static bool IsEqual(const T& lh, const T& rh)
    {
        std::cout << "in the general class..." << std::endl;
        return lh == rh;
    }
};

// specialize for float
template<>
class Compare
{
public:
    static bool IsEqual(const float& lh, const float& rh)
    {
        std::cout << "in the float special class..." << std::endl;

        return std::abs(lh - rh) < 10e-3;
    }
};

// specialize for double
template<>
class Compare
{
public:
    static bool IsEqual(const double& lh, const double& rh)
    {
        std::cout << "in the double special class..." << std::endl;

        return std::abs(lh - rh) < 10e-6;
    }
};

int main(void)
{
    Compare comp1;
    std::cout << comp1.IsEqual(3, 4) << std::endl;
    std::cout << comp1.IsEqual(3, 3) << std::endl;

    Compare comp2;
    std::cout << comp2.IsEqual(3.14, 4.14) << std::endl;
    std::cout << comp2.IsEqual(3, 3) << std::endl;

    Compare comp3;
    std::cout << comp3.IsEqual(3.14159, 4.14159) << std::endl;
    std::cout << comp3.IsEqual(3.14159, 3.14159) << std::endl;

    std::cout << hh()("11") << std::endl;
    system("pause");
    return 0;
}

其中tt.h如下:

#include
using std::string;

template
class hh
{
public:
	size_t operator()(const key& k) const {
		size_t hashVal = 0;

		key tmp = k;
		while (tmp > 0) {
			hashVal = 37 * hashVal + tmp % 10;
			tmp /= 10;
		}
		return hashVal;
	}
};

template<>
class hh
{
public:
	 size_t operator()(const string& key) {
		size_t hashVal = 0;
		std::cout << key << std::endl;
		for (char ch : key) {
			std::cout << "hasVal: " << hashVal << std::endl;
			hashVal = 37 * hashVal + ch;
		}

		return hashVal;
	}
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008503.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号