888*_*888 7 c++ templates function
阅读Wikibook Optimizing C++,在本段中有以下建议:
如果整数值在应用程序代码中是常量,但在库代码中是变量,则将其设为模板参数.
所以,如果我有一个像这样的功能
void myfunction(int param)
{
switch(param)
{
case 1:
do_something_1();
break;
case 2:
do_something_2();
break;
...
case 100: // 100 is taken as example
do_something_100();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
是否方便用以下更换?
template<int param> void myfunction()
{
switch(param)
{
case 1:
do_something_1();
break;
case 2:
do_something_2();
break;
...
case 100: // 100 is taken as example
do_something_100();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
还是完全没必要?你能告诉我原因吗?
只有在编译时知道参数时,您才想到的调整才有效.在您的引用中,假设您在编写库时无法进行应用程序代码.
如果您的函数调用过去的应用程序代码
const int x = 3;
myfunction(1);
myfunction(2);
myfunction(x);
//etc...
Run Code Online (Sandbox Code Playgroud)
它们可以重写如下.
const int x = 3;
myfunction<1>();
myfunction<2>();
myfunction<x>();
//etc...
Run Code Online (Sandbox Code Playgroud)
但如果x是变量,则不可能:
int x = ...; // unknown at compile-time!
myfunction<x>(); // will fail to compile!
Run Code Online (Sandbox Code Playgroud)
如上所述,在某些情况下,您在编写库时不应对应用程序进行假设.有时您想要或需要做.让我们考虑一下您希望应用程序使用常量的情况,但您不希望强制它执行此操作.
您希望针对它将使用常量的情况进行优化,但仍允许使用变量.为此,我建议两个选项:
制作两个选项,一个带有模板参数,另一个带有函数参数.
内联的功能,所以在编译应用程序代码时该函数的定义是由编译器看到和可用于优化其到单个do_something_*()呼叫,如果该参数是恒定的.
请注意,这两个选项都需要将函数的定义暴露给应用程序的代码.我更喜欢使用第二种选择.