簡體   English   中英

對模板參數的困惑

[英]Confusion about template parameters

最近在c++練習template的使用,過程中對模板參數有一個困惑。

例如,在下面的代碼中, template<typename A>的輸入A作為“類型”來構造 function 和變量。

template <typename A>
A add_simple(A a, A b)
{
    return a + b;
}

但是,在下面的示例中,我實現了一個單位轉換操作,輸入M1M2似乎充當了對象。 main()中,我展示了如何調用該結構。

// create a template struct Measure with value and unit. e.g. Measure<int, Unit>::value
template<int v, Unit u> struct Measure{
    static const int value=v;
    static const Unit unit=u;
};

// Conversion struct. expected input two 'Measure' objects. 
template <typename M1, typename M2> 
struct Measure_add {
public:
    // other implementation

    static constexpr int value=M1::value+M2::value;
};

int main(int, char**) {

    std::cout << Measure_add< Measure<10,Unit::m>,
        Measure<20,Unit::m> >::value << std::endl;

}

所以我對模板的困惑是:

  1. <template>是否設計得如此靈活,以至於它可以動態區分輸入,因此“類型”輸入和“對象”輸入都可以工作。 或者我在這里遇到的不同是因為預期輸入是構造模板輸入Measure 因此,M1 和 M2 仍然是“類型”,即Measure 在這種情況下,如果 M1 是一種類型而不是 object,為什么M1::value可用?

  2. 為什么可以訪問模板結構Measure_add中的M1::valueM2::value ,盡管此類結構的輸入未知。 換句話說,如果我輸入其他不包含屬性value的參數,是否會引起問題?

在您的代碼中, M1M2都是類型模板參數。 您可以說M::value的原因是value是一個 static 類型的數據成員,該類型替代了M 這就是static數據成員的要點:您不需要 object 來訪問它的值。 這與模板無關:

struct M {
    static constexpr int value = 0;
};

int foo() {
    return M::value;   // OK
}

M1M2不限於Measure模板的特化:它們可以是具有 static value數據成員的任何類型。 對於不滿足此條件的其他類型,您只會收到編譯錯誤。

std::cout <<
    Measure_add<
        std::integral_constant<int, 10>,
        std::integral_constant<int, 20>
    >::value;  // compiles, prints 30

std::cout << 
    Measure_add<
        Measure<10, Unit::m>,
        std::integral_constant<int, 20>
    >::value;  // compiles, prints 30, but makes no sense

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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