0

私の 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.019x = 2and y = 4) が、Marker表示される " " は 1 つだけです。どのように可能ですか?したがって、標準の pow() の代わりにコンパイル時の最適化にその関数を使用することは良いオプションですか?

どうもありがとうございました !

4

2 に答える 2

5

metaPowf(x,y)関数に渡される前に評価されていると思います。したがって、metaPowのx引数は、値sqrt *(8)にすぎません。metaPowがf(x、y)を呼び出すことはありません。したがって、f(x、y)は一度だけ呼び出されます-メイン関数で最初にmetaPowを呼び出すとき。

于 2012-05-08T03:48:56.917 に答える
2

おもう:

metaPow<5>(f(x, y))

に等しい

ダブル z = f(x, y); metaPow<5>(z);

于 2012-05-08T03:54:43.447 に答える