元编程中有哪些数学运算符可用
What math operators are available in metaprogramming
在Todd Veldhuizen的元编程指南中看到的最后一个例子给我留下了深刻的印象,其中像sin
和cos
这样的三角函数是在编译时预先计算的。老实说,它让我大吃一惊,如果你写的代码在循环中执行了大量这样的代码,就像我一样,那么这可能对提高性能有实质性的影响。
问题1
然而,它让我想知道什么是可用的运行时工具(调用实际的数学库函数,如sin
或cos
)和什么是可用的编译时数学运算符之间的界限在哪里。
Todd的例子需要使用普通的算术手动计算三角函数。
我是否假设编译器能够执行所有普通的数学函数*
+
-
/
,但没有其他功能?
问题2
在这种情况下,您只能获得sin
和cos
对整数计算的编译时结果,对吗?也就是说,您不能预编译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
函数来接受浮点形参并使用它们。
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- C++编程:运算符重载中的引用如何工作?
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 替换模板元编程中的三元运算符
- 什么是编程语言支持定义您自己的自定义运算符?
- 使用使用运算符<<并打印错误值 c++ 的类进行编程
- 在泛型编程C++重载增量运算符
- 当定义与运算符有价值时,#define 如何在编程中工作
- C++模板元编程:重载运算符
- C++模板元编程:模板类型上的编译时条件运算符
- 在任何编程语言中,递增和递减运算符的功能是什么?
- 在编程语言中扩展预增量运算符
- 用于编程练习的重载运算符
- 元编程中有哪些数学运算符可用
- 用C++元编程模板重载运算符