为什么要将值传递给模板而不是在函数调用中提供它?

时间:2014-03-28 19:39:16

标签: c++ templates

随着我学习C ++,有一个概念,我无法完全掌握和理解力学背后的推理。那个主题是:函数模板和在编译时传递参数,而不是运行时。

我想知道的是,在编译时传递--lets的值的设计背后的原因 - 例如 - 一个int值。我认为C ++的开发人员可能已经允许在运行时传递价值,但我想知道的是 - 选择传递值的原因,让在编译期间说一个int。当然,我正在谈论像这样的功能模板:

#include <iostream>
using namespace std;

template <class T, int N>
T fixed_multiply (T val)
{
  return val * N;
}

int main() {
  std::cout << fixed_multiply<int,2>(10) << '\n';
  std::cout << fixed_multiply<int,3>(10) << '\n';
}

据我所知,在编译时计算调用模板函数(在这种情况下为&lt; 2&gt;和&lt; 3&gt;)中分配的int值。设计这些机制背后的原因是什么?我理解它是为每个函数创建一个不同的实例,一个乘以2,另一个乘以3。因此,它不能传递变量,必须传递一个常量。

但为什么这有必要呢?我觉得设计师可以允许运行时执行,因此传递给它的值可能是变量,但显然设计师认为这样做会更好。

感谢。

3 个答案:

答案 0 :(得分:2)

当其中一个操作数是已知常量时,有时可以进行更多优化。

例如,在x86架构上,可以使用LEA指令实现乘以(常量)3,该指令的运行速度比IMUL快得多。用2的常数幂对无符号整数变量进行除法可以用右移位(和按位与模的模数)代替。

答案 1 :(得分:1)

想象一下,你必须将两个向量的所有元素相乘,并且你有一个算法可以转换向量的所有元素。

可以使用一个参数

的函数自定义算法

但是你有多个参数...所以你可以将一个参数绑定到一个联系人(在编译时)并有效地创建一个参数函数

答案 2 :(得分:1)

有人传递整数值或浮点值(很少)或者作为模板arg的主要原因是因为它们在问题中代表不同的类型。他们希望有可重用的方法和算法来运行这些类型。

从设计的角度来看,结帐Boost Multi Array为例。这是一个旨在支持n维数组的系统。所以当你定义时,

typedef boost::multi_array<double, 3> array_3d;
typedef boost::multi_array<double, 2> array_2d;

他们是两种完全不同的类型。有人可以编写一个特殊的迭代器,它需要multi_array<type, int>,而不必为2d和3d情况重新定义它。

可能存在以您列出的方式优化其功能的代码库,但这些是例外情况。优化并不是模板化任何东西的主要动机,但具有模块化,可重用的通用代码。