c++ 类模板与类成员函数模板(简单)

在C++中,类模板(Class Template)是一种强大的工具,允许编写通用的类,可以处理多种类型的数据。类模板的使用场景非常广泛,例如实现容器类(如std::vectorstd::list等)。以下是对类模板及其相关概念的简单说明和示例。


1. 类模板的定义

类模板允许我们定义一个通用的类,其中的某些成员类型或成员函数的参数类型可以是模板参数。

语法:

template <typename T>
class ClassName {
    // 类成员定义
};

示例:

#include <iostream>

template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    void display() const {
        std::cout << "Value: " << value << std::endl;
    }
};

2. 类模板的显式实例化

显式实例化是指在代码中明确指定类模板针对某种类型的实例化。它的语法如下:

template class ClassName<Type>;  // 显式实例化定义

示例:

#include <iostream>

template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    void display() const {
        std::cout << "Value: " << value << std::endl;
    }
};

// 显式实例化定义
template class Box<int>;    // 针对 int 类型的显式实例化
template class Box<double>; // 针对 double 类型的显式实例化

int main() {
    Box<int> intBox(42);
    intBox.display();  // 输出: Value: 42

    Box<double> doubleBox(3.14);
    doubleBox.display();  // 输出: Value: 3.14
    return 0;
}

3. 类模板的隐式实例化

隐式实例化是指在代码中使用类模板时,编译器自动根据模板参数类型生成对应的类。

示例:

#include <iostream>

template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    void display() const {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    Box<int> intBox(42);       // 隐式实例化 Box<int>
    intBox.display();          // 输出: Value: 42

    Box<double> doubleBox(3.14); // 隐式实例化 Box<double>
    doubleBox.display();        // 输出: Value: 3.14
    return 0;
}

4. 类模板的使用场景

类模板常用于以下场景:

  • 容器类:如std::vectorstd::list等。
  • 通用算法类:如排序、查找等算法的封装。
  • 智能指针:如std::shared_ptrstd::unique_ptr等。

5. 类成员函数模板

类成员函数模板是指类中的成员函数本身是模板函数。它可以是普通类的成员函数模板,也可以是类模板的成员函数模板。

5.1 普通类的成员函数模板

语法:
class ClassName {
public:
    template <typename T>
    void memberFunction(T arg);
};
示例:
#include <iostream>

class Printer {
public:
    template <typename T>
    void print(T value) {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    Printer p;
    p.print(42);       // 输出: Value: 42
    p.print(3.14);     // 输出: Value: 3.14
    p.print("Hello");  // 输出: Value: Hello
    return 0;
}

5.2 类模板的成员函数模板

语法:
template <typename U>
class ClassName {
public:
    template <typename T>
    void memberFunction(T arg);
};
示例:
#include <iostream>

template <typename U>
class Box {
private:
    U value;
public:
    Box(U v) : value(v) {}
    template <typename T>
    void display(T prefix) const {
        std::cout << prefix << " Value: " << value << std::endl;
    }
};

int main() {
    Box<int> intBox(42);
    intBox.display("IntBox:");  // 输出: IntBox: Value: 42

    Box<double> doubleBox(3.14);
    doubleBox.display("DoubleBox:");  // 输出: DoubleBox: Value: 3.14
    return 0;
}

6. 类模板的特化

类模板的特化是指为类模板的某个特定类型提供一个特殊的实现。特化分为完全特化和部分特化。

6.1 完全特化

完全特化是指为类模板的某个特定类型提供一个完全不同的实现。

语法:
template <>
class ClassName<Type> {
    // 特化实现
};
示例:
#include <iostream>

template <typename T>
class Box {
public:
    void display() const {
        std::cout << "Generic Box" << std::endl;
    }
};

// 完全特化
template <>
class Box<int> {
public:
    void display() const {
        std::cout << "Specialized Box for int" << std::endl;
    }
};

int main() {
    Box<double> doubleBox;
    doubleBox.display();  // 输出: Generic Box

    Box<int> intBox;
    intBox.display();  // 输出: Specialized Box for int
    return 0;
}

6.2 部分特化

部分特化是指为类模板的某些特定类型组合提供一个特殊的实现。

语法:
template <typename T>
class ClassName<T, Type> {
    // 部分特化实现
};
示例:
#include <iostream>

template <typename T, typename U>
class Pair {
public:
    void display() const {
        std::cout << "Generic Pair" << std::endl;
    }
};

// 部分特化
template <typename T>
class Pair<T, int> {
public:
    void display() const {
        std::cout << "Partial Specialization for Pair<T, int>" << std::endl;
    }
};

int main() {
    Pair<double, double> p1;
    p1.display();  // 输出: Generic Pair

    Pair<double, int> p2;
    p2.display();  // 输出: Partial Specialization for Pair<T, int>
    return 0;
}

总结

  • 类模板:用于定义通用的类,支持多种类型。
  • 显式实例化:明确指定类模板的实例化类型。
  • 隐式实例化:编译器根据使用场景自动实例化。
  • 类成员函数模板:类中的成员函数可以是模板函数。
  • 类模板特化:为特定类型提供特殊的实现。

通过合理使用类模板及其特性,可以编写出高效且灵活的代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值