c++ - 平方根元函数?

标签 c++ templates metaprogramming sqrt

是否可以使用具有以下签名的元函数计算整数的平方根:

template<unsigned int N> inline double sqrt();

(或者可能使用 constexpr 关键字,我不知道什么是最好的)。 这样,sqrt<2>()将被 1.414... 取代在编译时。

这种功能的最佳实现是什么?

最佳答案

这可能不是您想要的,但我想确保您意识到通常通过优化,编译器无论如何都会在编译时计算结果。例如,如果您有以下代码:

void g()
{
  f(sqrt(42));
}

使用 g++ 4.6.3 和优化 -O2,生成的汇编代码是:

   9 0000 83EC1C                subl    $28, %esp
  11 0003 DD050000              fldl    .LC0
  12 0009 DD1C24                fstpl   (%esp)
  13 000c E8FCFFFF              call    _Z1fd
  14 0011 83C41C                addl    $28, %esp
  16 0014 C3                    ret
  73                    .LC0:
  74 0000 6412264A              .long   1244009060
  75 0004 47EC1940              .long   1075440711

sqrt 函数实际上从未被调用,值只是作为程序的一部分存储。

因此,要创建一个在技术上满足您要求的函数,您只需要:

template<unsigned int N> inline double meta_sqrt() { return sqrt(N); }

关于c++ - 平方根元函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233251/

相关文章:

c++ - 从文本文件中读取输入,省略第一个并在末尾添加一个无意义的值?

c++ - 函数参数中的 const'ing 原始类型是否会显着提高性能?

c++ - 如何通过这个简单示例在 C++11 中正确使用可变参数模板?

grails - Grails 如何使 `params` 可用于单例 Controller ? (Grails 内部结构)

c++ - 无论存储类型如何,是否允许访问 union 成员的公共(public)基类?

c++ - nasm/yasm 参数,与 C++ 的链接

c++ - 如何在转换运算符中使用 std::enable_if?

c++ - 判断函数是否为const

c++ - 仅专门化嵌套模板

c++ - 通过继承类使用来自不同 namespace 的运算符?