2012-05-08 5 views
0

필자는 C++ 코드에서 이상한 메타 기능 동작이 있으며 그 이유를 알고 싶습니다. 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. 동등이라고 예상했다. 하지만 그랬다면 f 함수에 " Marker"줄을 5 번 인쇄 할 것입니다.

이상한 것은

내가 말 ( x = 2y = 4 예를 들어 181.019 용)에서 좋은 결과를 가지고있다 그러나 나는 단지 1 " Marker"표시가 있습니다. 그게 어떻게 가능해 ? 따라서 표준 pow() 대신 컴파일 타임 최적화에 해당 함수를 사용하는 것이 좋습니다.

대단히 감사합니다!

답변

5

나는 f(x,y)이 metaPow 함수로 전달되기 전에 평가되고 있다고 생각합니다. 따라서 metaPow에 대한 x 인수는 sqrt * (8) 값입니다. metaPow는 결코 f (x, y)를 호출하지 않습니다. 따라서 f (x, y)는 한 번만 호출됩니다. 처음에 주 함수에서 metaPow를 호출 할 때입니다.

2

는 생각 :

metaPow < 5> (F (X, Y))

이중 Z = f (x, y)에 동일하다; metaPow < 5> (z);