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

标签 c++ oop templates

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

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

对比

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

Thinking in C++,第 1 卷,第 2 版,在 Templates in depth 一章下,关于非类型模板参数只有几句话,我觉得我没有完全理解他们的目的。

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

最佳答案

不同之处在于模板的值是在编译时决定和固定的;即,当您编译程序时。编译完成后,您永远无法更改它们,它们将永远被视为常量。

所以,用:

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

关于C++:通过模板传递参数与通过函数参数传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42577867/

相关文章:

xml - 具有多个 ${cursor} 的 Eclipse XML 模板?

c++ - 构建模板类型的编译时列表?

c++ - 创建共享 packaged_task 接受带转发的参数

c# - Windows 资源管理器 IShellFolderViewDual::SelectItem 用法

c++ - 使用 C++ 编写的算法实时处理数据

c++ - Poco Logging Framework 中记录器层次结构的问题

objective-c - Cocoa的应用程序委托(delegate)范围有限制吗?

javascript - 使用 Object.defineProperties 定义属性

c# - 在其他类中组合一个类的对象时如何进行验证?

html - 如何覆盖结构 slice 而不是 slice 结构