美文网首页
★06.关于函数模板

★06.关于函数模板

作者: iDragonfly | 来源:发表于2017-06-30 22:16 被阅读0次

定义:

template <typename T>
void fun(T t) {
}

特化

代码

template<typename T>
void fun1(T t) {
    std::cout << "fun1(T t)" << std::endl;
}

// 通过自动推断来确定模板参数T的函数模板特化
template<>
void fun1(int t) {
    std::cout << "fun1(int t)" << std::endl;
}

template<typename T>
void fun2() {
    T t;
    std::cout << "fun2<T>()" << std::endl;
}

// 通过显式说明模板参数T为int的函数模板特化
template<>
void fun2<int>() {
    int t;
    std::cout << "fun2<int>()" << std::endl;
}

int main() {
    fun1(0.0);
    fun1(0);
    fun2<double>();
    fun2<int>();
    return system("pause");
}

输出

fun1(T t)
fun1(int t)
fun2<T>()
fun2<int>()

默认模板实参【C++11】

template<typename T, typename F = int>
void fun() {
}

显式指定模板实参

template <typename T>
void fun(T t) {
}

int main() {
    fun<int>(0.0);
    return system("pause");
}

显式实例化

// 声明函数模板实例化的作用是避免编译期多次重复实例化,可以达到加块编译速度的效果
// 下述两行代码不能出现在同一文件
template void fun(int t);          // 定义,代表此处将函数模板fun()实例化为fun<int>
extern template void fun(int t);   // 声明,代表承诺在别的文件有个fun<int>实例化

int main() {
    fun<int>(1);                   // 此处实际上没有实例化的过程,会复用已经声明的实例化
    return system("pause");
}

尾置返回类型的应用

// 此处不得不使用尾置返回类型,因为我们不知道beg的解引用是什么类型,而且beg知道参数列表才出现
template <typename T>
auto fun1(T beg, T end) -> decltype(*beg) {
    return * beg;
}

// decltype会把(*beg)推断为引用类型,想要移除引用可以使用remove_reference<decltype(*beg)>::type
template <typename T>
auto fun2(T beg, T end) -> typename remove_reference<declval(*beg)>::type {
    return * beg;
}

转发型引用

如果模板参数是T &&的形式,则可以给它传递任何类型的实参,详情请查阅转发型引用。

重载匹配问题

template<typename T1>
void fun(T1 t1, T1 t2) {
    std::cout << " 1" << std::endl;
}


template<typename T1, typename T2>
void fun(T1 t1, T2 t2) {
    std::cout << "2" << std::endl;
}


void fun(int t1, double t2) {
    std::cout << "3" << std::endl;
}

// 注意:特化本质上是实例化一个模板,而非重载它,不会影响函数匹配
template<>
void fun(int t1, int t2) {
    std::cout << "4" << std::endl;
}

// 注意:特化本质上是实例化一个模板,而非重载它,不会影响函数匹配
template<>
void fun(int t1, double t2) {
    std::cout << "5" << std::endl;
}


int main() {
    // 不用经过类型转换的函数匹配都叫精确匹配,有多个精确匹配版时,根据如下规则选择:
    fun(1, 1.0);            // 规则一:当只有一个非模板函数精确匹配时,优先选择此函数(1、2、3中选择3)
    fun(1.0, 1.0);          // 规则二:规则一不满足时,优先选择更特例化的函数模板版本(1、2、3中选择1)
    fun(1, 1);              // 规则二:规则一不满足时,优先选择更特例化的函数模板版本(1、2、3中选择1的特化版本4)
                            // 规则三:上述规则都失效时,调用有二义性。
    return system("pause");
}

相关文章

  • ★06.关于函数模板

    定义: 特化 代码 输出 默认模板实参【C++11】 显式指定模板实参 显式实例化 尾置返回类型的应用 转发型引用...

  • c++11新特性之模板的改进

    C++11关于模板有一些细节的改进: 模板的右尖括号 模板的别名 函数模板的默认模板参数 模板的右尖括号 C++1...

  • c++具体化和实例化的区别

    首先:区分 非模板函数 模板函数 具体化非模板函数就是没有template模板函...

  • GEEKBAND C++ STL与模板编程

    C++ 函数模板 函数模板的声明和模板函数的生成 1.函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多...

  • C++模板编程/泛型编程

    模板分类 模板分为函数模板与类模板两类。 函数模板 模板声明 模板定义 例如 函数模板实参类型不一致问题 参数推导...

  • Django自定义模板函数

    模板函数是使用于模板文件的处理函数,模板函数的使用方式是{% 模板函数 %} 1. 创建自定义函数文件夹 想要使用...

  • 14/12

    成员模板:模板类中成员变量是模板类对象(1),模板类中函数是模板函数(2)

  • 14/15

    约束模板友元 模板类的外边定义一个模板函数,在模板类中将模板函数具体化为模板类的友元函数 非约束模板友元 模板类中...

  • 第一章:函数模板

    函数模板是指被参数化的模板,可以代表一类函数。 1.1 初识函数模板 函数模板和普通函数看起来很相似,但是部分元素...

  • 2018-05-05

    CPP强弱类型 宽字符本地化 函数模板 函数重载: 根据参数来识别函数模板: 原生函数优先于模板函数 强行调用...

网友评论

      本文标题:★06.关于函数模板

      本文链接:https://www.haomeiwen.com/subject/uroicxtx.html