簡體   English   中英

C ++:奇怪的元函數調用

[英]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 = 2y = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM