[Lang] 函数模板

[Lang] 函数模板

1. 自动类型推导和显示指定类型

  • 自动类型推导不能进行隐式类型转换。
  • 显式指定类型可以进行隐式类型转换。但前提是函数模板的参数必须按值传递,因为按引用传递不支持隐式类型转换。
#include<iostream>
using namespace std;

template <typename T>
T myAdd(T a, T b)
{
    return a + b;
}

int main()
{
    int a = 10;
    char b = 'a';

    // cout << myAdd(a, b) << endl;
    // 自动类型推导不能进行隐式类型转换

    cout << myAdd<int>(a, b) << endl;
    // 显式指定类型可以进行隐式类型转换
    // 但前提是函数模板的参数必须按值传递,因为按引用传递不支持隐式类型转换

    return 0;
}
107

2. 普通函数和函数模板调用优先级

  • 普通函数优先级高于函数模板。
  • 除非函数模板存在比普通函数更好的匹配(不需要隐式类型转换),或者使用空模板参数列表强制调用函数模板。
#include<iostream>
using namespace std;

template <typename T>
T myAdd(T &a, T &b)
{
    cout << "函数模板调用"  << endl;
    return a + b;
}

int myAdd(int &a, int &b)
{
    cout << "普通函数调用" << endl;
    return a + b;
}

int main()
{
    int a = 10, b = 20;

    cout << myAdd(a, b) << endl;
    // 普通函数优先级高于函数模板

    char c = '1', d = '2';
    cout << myAdd(c, d) << endl;
    // 除非函数模板存在比普通函数更好的匹配(不需要隐式类型转换)

    cout << myAdd<>(a, b) << endl;
    // 或者使用空模板参数列表

    return 0;
}
普通函数调用
30
函数模板调用
c
函数模板调用
30

3. 函数模板完全特化

#include <iostream>
using namespace std;

// 通用函数模板
template <typename T>
void func(T param) {
    cout << "Generic template function: " << param << endl;
}

// 针对 int 类型的完全特化
template <>
void func(int param) {
    cout << "Specialized template function for int: " << param << endl;
}

int main() {
    func(42);         // 调用特化的 int 版本
    func(3.14);       // 调用通用模板版本
    func("Hello");    // 调用通用模板版本

    return 0;
}
Specialized template function for int: 42
Generic template function: 3.14
Generic template function: Hello
posted @ 2024-08-18 16:02  yaoguyuan  阅读(10)  评论(0)    收藏  举报