重载模板函数时显式特化和常规函数之间的区别

Pwn*_*nna 13 c++ templates overloading explicit-specialization

我今天开始了.这里是n00b问题7:

当您尝试重载模板函数时,显式特化和常规函数之间的区别是什么?

使用显式专业化的适当情况是什么?我不太明白:

#include <iostream>

template <typename s> void test(s var1);
template <> void test<int>(int var1);

int main(){
    test(1);
    test(1.1);
    test("hello!!");
    return 0;
}

template <typename s> void test(s var1){
    std::cout << var1 << std::endl;
}

template <> void test<int>(int var1){
    std::cout << "int " << var1 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

反对:

#include <iostream>

template <typename s> void test(s var1);
void test(int var1);

int main(){
    test(1);
    test(1.1);
    test("hello!!");
    return 0;
}

template <typename s> void test(s var1){
    std::cout << var1 << std::endl;
}

void test(int var1){
    std::cout << "int " << var1 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*son 6

显式专用模板函数和非模板常规函数之间没有区别,除了当编译器为函数调用查找匹配的签名类型时,它将首先选择匹配的非模板函数在尝试实例化可能满足所需签名匹配的任何可用模板函数之前所需的签名.

如果要在不是模板函数的头文件中声明和定义函数,则必须将函数声明为inline.这是因为模板函数不是与代码模块链接的实际函数,直到它实际被实例化为止.然后链接器在编译代码模块后抛弃该实例化.如果链接器没有这样做,那么每当.cpp文件包含头文件时,链接器就会抱怨函数的重复定义.使用inline在非模板函数关键字在编译器级别类似的效果,在函数在.cpp文件使用的任何时候,编译器替换函数调用的函数代码的尸体从inline在功能头文件,并避免使用相关堆栈活动记录设置和清理的函数调用的开销.因此,链接器不会抱怨函数的重复定义.