是否可以使用具有以下签名的元函数计算整数的平方根:
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); }