C++ 函数与带有整数参数的模板?

标签 c++ function templates

阅读维基教科书 Optimizing C++ , 在 this paragraph有以下建议:

If an integer value is a constant in the application code, but is a variable in library code, make it a template parameter.

所以如果我有这样的函数

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

换成下面的方便吗?

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

或者完全没有必要?能解释一下原因吗?

最佳答案

只有当参数在编译时已知时,您所想到的调整才有效。在您的引述中,有一个关于您在编写库时无法做出的应用程序代码的假设。

如果您的函数调用在应用程序代码中曾经是

const int x = 3;
myfunction(1);
myfunction(2);
myfunction(x);
//etc...

它们可以重写如下。

const int x = 3;
myfunction<1>();
myfunction<2>();
myfunction<x>();
//etc...

但是如果 x 是一个变量,那是不可能的:

int x = ...;      // unknown at compile-time!
myfunction<x>();  // will fail to compile!

如上所述,有些情况下您不应该在编写库时对应用程序做出假设。有时您想要或需要做。让我们考虑这样一种情况,您期望应用程序使用常量,但您不想强制它这样做。

您想针对使用常量的情况优化,但仍然允许使用变量.为此,我建议两种选择:

  • 做出两种选择,一种使用模板参数,一种使用函数参数。

  • 内联函数,因此在编译应用程序代码时,编译器可以看到函数的定义,并可用于将其优化为单个do_something_*() 调用如果参数是常量。

请注意,这两个选项都需要将函数的定义公开给应用程序的代码。我更愿意使用第二个选项。

关于C++ 函数与带有整数参数的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15108444/

相关文章:

c++ - 我应该手动删除智能指针吗?

c++ - MDI MFC VC++如何在大型机内切换 View

actionscript-3 - AS3 获取舞台上某个类的所有实例的数组?

c - "Predefined Function"到底是什么?

function - 如何在 haskell 中使用参数内部的函数?

c++ - 可变参数模板的未声明标识符

c++ - 显式实例化类模板中的自动构造函数

c++ - 如何避免重复的模板特化?

c++ - 如何识别模板参数是否为 std::complex?

c++ - decltype()对于正在编译的类模板不起作用