非类型模板参数,C ++中的部分专业化vs函数参数

时间:2020-10-02 13:15:09

标签: c++

简短问题;

我不知道为什么存在这种语法:

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;
}

3 个答案:

答案 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_sharedstd::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:您的代码中没有部分专业化的内容。