【问题标题】:What math operators are available in metaprogramming元编程中有哪些数学运算符可用
【发布时间】:2013-05-27 05:03:55
【问题描述】:

看到 Todd Veldhuizen 的metaprogramming guide 中的最后一个示例给我留下了深刻的印象,其中像sincos 这样的三角函数是在编译时预先计算的。老实说,这让我大吃一惊,如果您编写的代码像我一样在循环中执行大量此类操作,那么这可能会对提高性能产生重大影响。

问题 1

但是,这让我想知道在可用作运行时工具(调用实际数学库函数,如 sincos)与仅可用作编译时工具之间的界线在哪里数学运算符。

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

那么我是否可以假设编译器能够处理所有普通数学函数 * + - / 但没有别的?

问题 2

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

或者如果模板只能接受整数作为参数,你可以取几个整数并在类中用它们创建一个float,比如传递123,然后将1.23传递给获取浮点值的sin

【问题讨论】:

    标签: c++ templates math metaprogramming


    【解决方案1】:

    问题 1

    但是,这让我想知道在可用作运行时工具(调用诸如 sin 或 cos 等实际数学库函数)与仅可用作编译时数学运算符之间的界限在哪里。

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

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

    问题 2

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

    是和不是。在 C++03 中,您仅限于内置函数和模板元函数,constexpr 不可用。因此,sin 必须是一个模板元函数,它只能对整数常量起作用,因为模板中不允许使用浮点类型。但是,您可以为分数或定点值定义模板,并为它们提供sin 模板。不过这会非常乏味,而且您很容易最终遇到模板实例化限制。

    从 C++11 开始,您可以编写 constexpr 接受浮点参数并使用这些参数的函数。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 2019-09-04
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2013-07-12
    相关资源
    最近更新 更多