[英]Confusion about template parameters
最近在c++練習template
的使用,過程中對模板參數有一個困惑。
例如,在下面的代碼中, template<typename A>
的輸入A
作為“類型”來構造 function 和變量。
template <typename A>
A add_simple(A a, A b)
{
return a + b;
}
但是,在下面的示例中,我實現了一個單位轉換操作,輸入M1
和M2
似乎充當了對象。 在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;
}
所以我對模板的困惑是:
<template>
是否設計得如此靈活,以至於它可以動態區分輸入,因此“類型”輸入和“對象”輸入都可以工作。 或者我在這里遇到的不同是因為預期輸入是構造模板輸入Measure
? 因此,M1 和 M2 仍然是“類型”,即Measure
。 在這種情況下,如果 M1 是一種類型而不是 object,為什么M1::value
可用?
為什么可以訪問模板結構Measure_add
中的M1::value
或M2::value
,盡管此類結構的輸入未知。 換句話說,如果我輸入其他不包含屬性value
的參數,是否會引起問題?
在您的代碼中, M1
和M2
都是類型模板參數。 您可以說M::value
的原因是value
是一個 static 類型的數據成員,該類型替代了M
。 這就是static
數據成員的要點:您不需要 object 來訪問它的值。 這與模板無關:
struct M {
static constexpr int value = 0;
};
int foo() {
return M::value; // OK
}
M1
和M2
不限於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.