[英]C++ : Strange metafunction call
我的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
”行的五倍。
奇怪的是,最后我得到了不錯的結果(例如x = 2
和y = 4
181.019
),但是我只顯示了1個“ Marker
”。 這怎么可能 ? 因此,使用該函數代替標准的pow()進行編譯時優化是一個不錯的選擇嗎?
非常感謝你 !
我相信f(x,y)
在傳遞給您的metaPow函數之前正在評估。 因此,metaPow的x參數只是值sqrt *(8)。 metaPow從不調用f(x,y)。 因此,f(x,y)僅被調用一次-當您最初在主函數中調用metaPow時。
我認為:
metaPow <5>(f(x,y))
等於
雙z = f(x,y); metaPow <5>(z);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.