C++ 模板的使用<;typename>;

C++ 模板的使用<;typename>;,c++,c++11,templates,C++,C++11,Templates,假设我有如下代码: #include <iostream> template<typename> void printnum(int i) { std::cout<<"in int method:"<<std::endl; std::cout<< i<<std::endl; } template<typename> void printnum(char i) { std::cout

假设我有如下代码:

#include <iostream>

template<typename>
void printnum(int i) {

    std::cout<<"in int method:"<<std::endl;
    std::cout<< i<<std::endl;
}

template<typename>
void printnum(char i) {

    std::cout<<"in char method:"<<std::endl;
    std::cout<<(int)i<<std::endl;
}

int main() {

    printnum<int>(2);
    printnum<char>(3);
}
我编写此测试代码的目的是确认/不确认我(自然)对
模板使用的理解。由于给定的模板类型没有参数,我认为这样的构造将有助于重载解析。也就是说,如果没有模板注释,很明显我将获得上述输出。但是有了模板注释,我想我可能会强迫编译器(在
3-call
的情况下)使用
printnum()
函数的
char变量,但事实并非如此


因此,我的一般问题是:
模板
构造的用途是什么?

对于所有类型的
T
,都有一系列函数,将
int
作为参数(在
T
int
之间没有联系);顺便说一句,所有人都在做同样的事情。对于所有类型的
T
,您还有另一个函数族,将
char
作为参数

省略名称
T
不会在函数模板上传递任何神奇的特性:
template void f()
模板void f()是完全等效的

printnum(2)
实例化第一个系列中的一个函数(对于
T==int
),以及第二个系列中的一个函数,并对它们执行重载解析。来自第一个家庭的功能获胜。与
printnum(3)


您可能会考虑模板专门化:

template <typename T> void printnum(T);

template<>
void printnum(int i) {

    std::cout<<"in int method:"<<std::endl;
    std::cout<< i<<std::endl;
}

template<typename>
void printnum(char i) {

    std::cout<<"in char method:"<<std::endl;
    std::cout<<(int)i<<std::endl;
}
模板void printnum(T);
模板
void printnum(int i){
std::cout

模板
void printnum(int i){

std::cout主要原因是允许显式专门化参数。请考虑:

#include <iostream>

template<typename> void printnum(int i);

template<>
void printnum<int>(int i) {
    std::cout<<"in int method: "<<i<<std::endl;
}

template<>
void printnum<char>(int i) {
    std::cout<<"in char method: "<<i<<std::endl;
}

int main() {
    printnum<int>(2);
    printnum<char>(3);
}

它创建两个不同的
printnum(int)
函数,这些函数由显式模板参数选择。主要用于调用
printnum(int)
来自具有
T
类型参数的其他模板函数。

用于定义具有单个模板参数的模板:类。这就是它的含义。包括“2”和“3”是
int
s,因此选择了接受
int
参数的函数。模板参数不是一个因素。当然还有“使用”在C++库中有很多模板将一个类作为一个参数。好的,但是这并不能回答这个问题。在这个代码中根本没有任何意义。因为模板参数不在任何地方使用(更不用说过载解决),这没关系。你可以放<代码> PrimtUnm(3)。
在这和
int
参数重载仍然是
printnum(int)
printnum(char)
中的最佳选择@WhozCraig:是的,这很清楚,因为代码没有达到我“希望”的效果,并且执行了默认的重载解析行为,即使用“空模板”是无用的。那么也许你可以举个例子,说明这样一个“空模板”有什么意义?那么,这个构造是无用的。否则你可以举个例子,说明为什么这个构造不是无用的。@Flori避免命名模板参数和避免命名函数参数一样有用:避免“未使用的参数”警告。谢谢,这是一个很好的解释。因此,一般来说,唯一的效果是创建一个函数族,在编译时选择其中一个,这与该族的所有其他函数相同。但我不明白为什么这样做是有意义的。它通常没有意义。不清楚为什么要创建函数模板,而不使用函数模板模板参数。谢谢,这就是我想要的,这很有意义。
template<typename>
void printnum(int i) {
    std::cout<<"in int method:"<<std::endl;
    std::cout<< i<<std::endl;
}
template<typename T>
void printnum(int i) {
    std::cout<<"in int method:"<<std::endl;
    std::cout<< i<<std::endl;
}
#include <iostream>

template<typename> void printnum(int i);

template<>
void printnum<int>(int i) {
    std::cout<<"in int method: "<<i<<std::endl;
}

template<>
void printnum<char>(int i) {
    std::cout<<"in char method: "<<i<<std::endl;
}

int main() {
    printnum<int>(2);
    printnum<char>(3);
}
in int method: 2
in char method: 3