C/C++教程

C++模板特化与偏特化的说明与代码示例

本文主要是介绍C++模板特化与偏特化的说明与代码示例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

模板特化的定义

模板特化不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化,以实现特定类型下非通用行为。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。

特化主要分三种

(1)全特化:将模板的参数全部指定为特定类型,类和函数都支持

(2)偏特化:部分参数指定为特定的类型,模板函数不支持偏特化

(3)特化为另外一个类模板(复杂点的偏特化),其实这种也是类似于1,2形式

类的特化

例如下面是类的全特化与偏特化的写法:

#includeusing namespace std;

templateclass AAA
{
public:
    void show()
    {
        cout << "普通模板类" << endl;
    }
};

template<>
class AAA{
public:
    void show()
    {
        cout << "全特化类" << endl;
    }
};

templateclass AAA{
public:
    void print()
    {
        cout << "偏特化" << endl;
    }
};

int main()
{
    AAAa1;
    a1.show();

    AAAa2;
    a2.show();

    AAAa3;
    a3.print();

    return 0;
}

运行结果:

普通模板类
全特化类
偏特化

模板类在声明对象时,如果指定了参数的类型,对象在调用函数时,就会调用特定类的方法,如果偏特化的参数和全特化的参数相同时,调用的是全特化的方法。特化时,类名得保持一致。

函数模板的特化

例如下面的代码

#includeusing namespace std;

//函数主模板
templatevoid  test(T1  a, T2  b)
{
	cout << "函数主模板" << endl;
}

//函数的全特化
template <>
void  test(int  a, int  b)
{
	cout << "全特化" << endl;
}

//函数没有偏特化,因为有了函数重载
templatevoid  test(T1  a, double  b)
{
	cout << "函数模板没有偏特化" << endl;
}

int main()
{
	//普通的函数模板
	test(1, 2.0f);

	//全特化的模板
	test(1, 2);

	//函数偏特化
	test(1, 1.234);

	return 0;
}

运行结果

函数主模板
全特化
函数主模板

函数没有偏特化,最后的test

特化的应用

模板的特化在STL中应用的很广泛,例如萃取技术。下面应用模板特化来写一个“数据比较”的功能, 代码如下:

#include#includeusing namespace std;

//Data类模板
templateclass Data
{
public:
    static bool IsEqual(const T& t1, const T& t2)
    {
        return t1 == t2;
    }
};

//特化为float类型
template<>
class Data{
public:
    static bool IsEqual(const float& t1, const float& t2)
    {
        return abs(t1 - t2) < 10e-3;
    }
};

//特化为double类型
template<>
class Data{
public:
    static bool IsEqual(const double& t1, const double& t2)
    {
        return abs(t1 - t2) < 10e-6;
    }
};

//特化为T*
templateclass Data{
public:
    static bool IsEqual(const T* t1, const T* t2)
    {
        return Data::IsEqual(*t1, *t2);
    }
};

//特化为容器类型
templateclass Data<vector>
{
public:
    static bool IsEqual(const vector& vec1, const vector& vec2)
    {
        if (vec1.size() != vec2.size())
        {
            return false;
        }
        else
        {
            for (int i = 0; i < vec1.size(); ++i)
            {
                if (vec1[i] != vec2[i])
                    return false;
            }
        }

        return true;
    }
};

int main()
{
    cout << "float -->>  " <<  Data::IsEqual(1.2, 1.3) << endl;
    cout << "double -->>  " << Data::IsEqual(1.23456, 1.23456) << endl;

    int a = 12;
    int* pA = &a;

    int b = 12;
    int* pB = &b;

    cout << "int* -->>  " << Data::IsEqual(pA, pB) << endl;

    vectorvec1 = { 1,2,3,56,7 };
    vectorvec2 = { 1,2,3,56,7 };
    cout << "vec -->>  " << Data<vector>::IsEqual(vec1, vec2) << endl;
	
	return 0;
}

运行结果:

float -->>  0
double -->>  1
int* -->>  1
vec -->>  1

怎样知道类是不是特化

一般的看到class

这篇关于C++模板特化与偏特化的说明与代码示例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!