专用模板函数与没有模板关键字的专用模板函数
Specialized template function vs specialized template function without template keyword
代码 1:
template<typename T>
T sum(T t1, T t2)
{
return t1 + t2;
}
int sum(int a, int b)
{
return a + b + a;
}
int main()
{
sum(10,20);
return 0;
}
代码 2:
template<typename T>
T sum(T t1, T t2)
{
return t1 + t2;
}
template<>
int sum<int>(int a, int b)
{
return a + b + a;
}
int main()
{
sum(10,20);
return 0;
}
在这两种情况下,专门的求和函数有什么不同吗?
我的编译器为这两种情况提供了相同的输出。
我一直遵循第一种方法。区别仅仅是从第二种方式我们一看就知道是一个专门的函数吗?
第一个是模板特化,第二个是函数重载。它在解析规则中很重要 - 完全匹配的重载将通过专门的模板进行选择。
如果你有函数 sum2:
template<typename T>
T sum2(T t1, T t2)
{
...
return sum<T>(t1, t2);
}
它不会调用重载变体 1,但会从变体 2 调用模板特化。
代码 1:
template<typename T>
T sum(T t1, T t2)
{
return t1 + t2;
}
int sum(int a, int b)
{
return a + b + a;
}
int main()
{
sum(10,20);
return 0;
}
代码 2:
template<typename T>
T sum(T t1, T t2)
{
return t1 + t2;
}
template<>
int sum<int>(int a, int b)
{
return a + b + a;
}
int main()
{
sum(10,20);
return 0;
}
在这两种情况下,专门的求和函数有什么不同吗? 我的编译器为这两种情况提供了相同的输出。 我一直遵循第一种方法。区别仅仅是从第二种方式我们一看就知道是一个专门的函数吗?
第一个是模板特化,第二个是函数重载。它在解析规则中很重要 - 完全匹配的重载将通过专门的模板进行选择。
如果你有函数 sum2:
template<typename T>
T sum2(T t1, T t2)
{
...
return sum<T>(t1, t2);
}
它不会调用重载变体 1,但会从变体 2 调用模板特化。