c++之普通函数和模板函数的调用规则

1.如果模板函数和普通函数都可以实现,则优先调用普通函数。

2.可以通过空模板参数列表来强制调用模板函数;

3.函数模板也可以重载;

4.如果函数模板可以产生更好的匹配,优先调用函数模板;

#include<iostream>
using namespace std;

int myAdd(int a, int b) {
    cout << "调用普通函数" << endl;
    return a + b;
}
template<class T>
T myAdd(T a, T b) {
    cout << "调用函数模板" << endl;
    return a + b;
}
template<class T>
T myAdd(T a, T b,T c) {
    cout << "调用重载函数模板" << endl;
    return a + b;
}
void test() {
    int a = 10;
    int b = 20;
    //1这里调用普通函数
    cout << myAdd(a, b) << endl;
    //2这里调用函数模板
    cout << myAdd<>(a, b) << endl;
    //3这里调用重载函数模板
    cout << myAdd(a, b, 100) << endl;
    //4这里调用函数模板
    cout << myAdd(‘a‘, ‘b‘) << endl;
}

int main() {
    test();
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/xiximayou/p/12106230.html

时间: 2024-07-31 18:04:42

c++之普通函数和模板函数的调用规则的相关文章

C++普通函数与模板函数以及特化函数重载的优先级问题

在面对C++模板的时候,需要十分注意,因为模板的复杂性有很多情况,所以最好学习模板的方法我个人认为就是用到就去学,用不到就尽量别去看各种奇门怪技,因为你就算看了,好不容易搞懂模板的实现内部了,包括元编程啊什么的,但真正用到工作中的我相信很少,不久你也会忘掉,所以,对于模板,我们可以采取用到哪学到哪的观念去学习,这样可以节省时间并且让效率最大化. 今天主要讲在关于模板特化已经函数重载的问题,简单举下例子 1 void say(int value); 2 template <typename T>

模板函数

1.函数可以和类一样定义为模板函数. 模板函数与模板类最大的不同是:模板函数可以通过函数的参数确定模板类型. template<class T,int i> T&lookup(string<T> &s,const int n){......} string<float> s; int x=0; lookup(s,x);//这里自动识别到T就是float 类模板不会对参数进行推断的原因是一个类可以提供多个构造函数,在某些时候对模板类的参数进行推断是无法完成

聊聊C++模板函数与非模板函数的重载

函数重载在C++中是一个很重要的特性.之所以有了它才有了操作符重载.iostream.函数子.函数适配器.智能指针等非常有用的东西. 平常在实际的应用中多半要么是模板函数与模板函数重载,或者是非模板函数与非模板重载.而让模板函数与非模板函数重载的情况却很少. 前几天在项目中偶然遇到了一个模板函数与非模板函数重载的诡异问题,大概相当于下面这种情况: 1 template <typename T> 2 int compare(const T& lhs, const T& rhs)

函数模板和模板函数

1.1函数模板的声明函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:template<typename 数据类型参数标识符><返回类型><函数名>(参数表){ 函数体}其中,template是定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符.这样,在以

[转]C++函数模板与模板函数

1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板的声明形式为: template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) {     函数体 } 其中,template是 定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符

[c++][语言语法]函数模板和模板函数

参考:http://blog.csdn.net/beyondhaven/article/details/4204345 1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板的声明形式为: template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) {     函数体 } 其中,template

C++ template学习一(函数模板和模板函数)

函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:template<typename(或class) T><返回类型><函数名>(参数表){ 函数体}其中,template是定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符

C++类中的成员函数和构造函数为模板函数时的调用方法

所谓模板函数其实就是建立一个通用函数,这个通用函数的形参类型不具体指定,用一个虚拟类型来代表,这个通用函数就被称为函数模板. 例: #include <iostream> using namespace std; class A { public: template<typename T> void display(T temp); template<typename T> A(T temp); }; template<typename T> void A:

类成员函数作为pthread_create函数参数

from:http://www.cnblogs.com/shijingxiang/articles/5389294.html 近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数exec_task中调用pthread_create去启动线程执行例程thread_rounter.编译之后报错如下: spfs_threadpool.cpp: In member function ‘int Threadpool::exec_task(task*)’: spfs_threadpoo