C++:通过模板传递参数 vs 通过函数参数传递

4

通过模板发送参数有什么用途吗?如果有,那么这与通过内部堆栈发送参数有什么不同?示例:

void myMethod(int argument){//Do something with *argument* };

vs

template<int argument>
void myMethod(){//Do something with *argument* };

在《C++编程思想》第2版第1卷的模板深入一章中,只有很少关于非类型模板参数的内容,我感觉自己并没有完全理解它们的作用。

1
模板参数是编译时常量。例如,当argument是一个模板时,您可以在语句std::array<int, argument>中使用它。 - François Andrieux
2个回答

1

区别在于模板中的值是在编译时确定和固定的。也就是说,在编译程序时,您不能再更改它们,并且它们被认为是永久的常量。

因此,在使用模板时:

template<int argument>
void myMethod(){//Do something with *argument* };

如果您调用myMethod<5>(),那么argument的值始终为5,并且该函数在运行时实际上没有任何参数。现在,如果您调用myMethod<6>(),编译器将重新创建相同的函数,但使用另一个常量值。因此,在运行时您将有两个函数。
另一方面,对于普通方法,您可以在运行时更改它们,即当程序正在运行时。再次调用该函数将只执行具有不同参数值的相同代码。
例如:
template <int L>
void DoSomething()
{
    int a[L];  //this works fine here! Becasue L is just a constant that is resolved at compile-time
    for(int i = 0; i < L; i++)
    {
        //do stuff
    }
}


void DoSomething(int L)
{
    int a[L];  //this won't work, because L is a variable that can be set while the program is running
    for(int i = 0; i < L; i++)
    {
        //do stuff
    }
}

这有点虚假,正如constexpr所强调的那样,但也足够正确。 - Yakk - Adam Nevraumont

1
这里:
void myMethod(int argument){//Do something with *argument* };

在运行时将参数传递给myMethod,因此可以传递不同的值。

这里:

template<int argument>
void myMethod(){//Do something with *argument* };

argument模板参数在编译时传递。

当与类一起使用时,非类型模板参数具有更大的影响,例如:

template<int N>
class Test{};

typedef Test<1> test1_type;
typedef Test<2> test2_type;

static_assert(std::is_same<test1_type, test2_type>::value == false, "");

test1_typetest2_type 是不同的类型。


你在第二个例子中缺少了 <type argument> - Fabian Klötzl
@FabianKlötzl 已修复。 - marcinj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接