C ++:通过模板Vs通过函数参数

时间:2017-03-03 11:36:26

标签: c++ oop templates

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

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

VS

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

Thinking in C ++ ,第1卷,第2版,模板深入一章中,关于非类型模板参数的说法很少,我觉得我并没有完全理解他们的目的。

编辑: 感谢您的解释。如果可以,我会标记两个答案,因为它们互为补充。

2 个答案:

答案 0 :(得分:1)

不同之处在于,对于模板,值在编译时决定并修复;即,编译程序时。在编译完成后,你无法改变它们,并且它们永远被认为是常量。

所以,用:

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

如果您调用myMethod<5>(),则argument的值始终为5,并且该函数在运行时几乎没有任何参数。现在,如果调用myMethod<6>(),编译器将重新创建相同的函数,但使用另一个常量值。因此,您在运行时将拥有2个函数。

另一方面,使用常规方法,您可以在运行时更改它们,即在程序运行时更改它们。再次调用该函数将只执行具有不同参数值的相同代码。

示例:

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

答案 1 :(得分:1)

下面:

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

参数在runTime期间传递给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是不同的类型