元编程中有哪些数学运算符可用

What math operators are available in metaprogramming

本文关键字:运算符 编程      更新时间:2023-10-16

在Todd Veldhuizen的元编程指南中看到的最后一个例子给我留下了深刻的印象,其中像sincos这样的三角函数是在编译时预先计算的。老实说,它让我大吃一惊,如果你写的代码在循环中执行了大量这样的代码,就像我一样,那么这可能对提高性能有实质性的影响。

问题1

然而,它让我想知道什么是可用的运行时工具(调用实际的数学库函数,如sincos)和什么是可用的编译时数学运算符之间的界限在哪里。

Todd的例子需要使用普通的算术手动计算三角函数。

我是否假设编译器能够执行所有普通的数学函数* + - /,但没有其他功能?

问题2

在这种情况下,您只能获得sincos对整数计算的编译时结果,对吗?也就是说,您不能预编译sin 45.5之类的结果,对吗?

或者如果模板只能接受整数作为参数,你可以取几个整数,然后在类中把它们变成一个float,比如传递1 2 3,传递1.23来获得浮点值的sin

问题1

然而,它让我想知道什么是可用的运行时工具(调用实际的数学库函数,如sin或cos)和什么是可用的编译时数学运算符之间的界限在哪里。

  • 命名函数只能在编译时使用,如果它们声明为constexpr,遵守constexpr的规则,并使用编译时常量调用。
  • 用户定义的数据类型只能在编译时使用,如果它们是通过constexpr构造函数从编译时常量构造的。
  • 任何对编译时常量内置类型进行操作的内置操作符都会给出一个编译时常量。
  • 如果原始类型是编译时间常数,则内置类型之间的任何类型转换都会给出编译时间常数。

因此,它不仅限于四种数学运算符,还可以使用%和其他运算符,以及模板元函数和constexpr表达式。

问题2

在这种情况下,您只能在整数上获得sin和cos计算的编译时结果,对吗?也就是说,您不能预编译像sin45.5这样的结果,对吗?

是和不是。在c++ 03中,您只能使用内置函数和模板元函数,constexpr不可用。因此,sin必须是一个只能处理整型常量的模板元函数,因为模板中不允许使用浮点类型。但是,您可以为分数或定点值定义模板,并为这些定义sin模板。这将是相当乏味的,但你可以很容易地结束运行到模板实例化的限制。

从c++ 11开始,您可以编写constexpr函数来接受浮点形参并使用它们。