简短问题;
我不知道为什么存在这种语法:
template <int in>
void test(){
std::cout << in << std::endl;
}
int main(){
test<5>();
return 0;
}
在没有模板的情况下也可以这样做:
void test(test in){
std::cout << in << std::endl;
}
int main(){
test(5);
return 0;
}
答案 0 :(得分:1)
没有模板怎么办?
template<std::size_t n> void f() {
char buf[n];
}
此外,将值作为参数传递需要额外的参数,额外的运行时开销,当您知道某个值实际上是编译时常量时并不一定需要。对于类,将需要一个额外的成员和一个类的额外构造参数,否则该类可能是空的且无关紧要的。
答案 1 :(得分:1)
您显示的不是部分专业化。
以下是专业化的示例(在本例中为完全专业化):
#include <iostream>
template <int in, int in2>
void test_template(){
std::cout << in << std::endl;
}
template <>
void test_template<1>(){
std::cout << "one" << std::endl;
}
template <>
void test_template<2>(){
std::cout << "two" << std::endl;
}
int main()
{
test_template<1>();
test_template<2>();
test_template<3>();
test_template<4>();
}
以特殊方式处理某些模板参数很有用。 (部分专业化是指您有多个模板参数,并且对其中一个模板化参数除外)
对于您的示例,您所显示的用例并未说明在何处有用,因为在此使用常规函数的确没有太大区别。
但是,如果您查看诸如std::make_shared
或std::make_pair
之类的函数,那么不使用模板就无法解决此问题:
template< class T1, class T2 >
std::pair<T1,T2> make_pair(T1 t, T2 u) {
return std::pair<T1,T2>(t,u);
}
答案 2 :(得分:0)
它们不是“相同”。
test
的两个版本非常不同。我将它们重命名以避免混淆,仅列出一些区别:
template <int in>
void test_template(){
std::cout << in << std::endl;
}
void test_fun(test in){
std::cout << in << std::endl;
}
test_template
是模板。它不是功能。例如,不可能获得指向test_template
的指针:
auto f_ptr1 = &test_template; // doesn't make sense
auto f_ptr2 = &test_fun; // OK
必须在编译时知道模板参数:
int x;
std::cin >> x;
test_template<x>(); // error: x must be known at compile time
test_fun(x); // OK
另一方面,实例化模板后,您将获得一个不带参数的函数:
auto f = &test_template<5>;
f();
auto g = &test_template<6>;
g();
类似地,您只能将test_fun
包装到另一个函数中(例如,开销)。
...等等。
PS:您的代码中没有部分专业化的内容。