私の C++ コードで奇妙なメタ関数の動作があり、その理由を理解したいと思っています。
#include <iostream>
#include <cmath>
inline double f(double x, double y)
{
std::cout<<"Marker"<<std::endl;
return sqrt(x*y);
}
template <int N, class T> inline T metaPow(T x)
{
return ((N > 0) ? (x*metaPow<((N > 0) ? (N-1) : (0))>(x)) : (1.));
}
int main()
{
double x;
double y;
std::cin>>x;
std::cin>>y;
std::cout<<metaPow<5>(f(x, y))<<std::endl;
return 0;
}
この行metaPow<5>(f(x, y))
は と同等だと思っていましたf(x, y)*f(x, y)*f(x, y)*f(x, y)*f(x, y)*1.
。しかし、そうであればMarker
、関数の " " 行が5 回出力されf
ます。
奇妙なことは、最後に良い結果が得られていることです (たとえば181.019
、x = 2
and y = 4
) が、Marker
表示される " " は 1 つだけです。どのように可能ですか?したがって、標準の pow() の代わりにコンパイル時の最適化にその関数を使用することは良いオプションですか?
どうもありがとうございました !