[英]Confusion about use of scope resolution operator in STL
我正在從中學習C ++的書包括以下示例:
const int numMembers = tuple_size<tupleType>::value;
和這個:
vector <int>::iterator arrIterator = intArray.begin ();
在這兩種情況下,我都不清楚如何使用范圍解析運算符(::)。 在這些示例中,分別如何精確確定value和iterator的值?
在這兩種情況下,合格名稱都用於命名類模板專業化的成員。 這可以用來命名靜態類成員。 而且, typedef
或using
別名可以出現在類定義或類模板定義中,並且類型別名被認為是該類的成員。
std::tuple_size<tupleType>::value
是靜態成員(指定元組類型中元素的數量)。 std::vector<int>::iterator
是成員類類型(該類型的對象可用於迭代向量的元素)。
例如:
template <typename T> class A
{
public:
static const int value = 3;
typedef int number_type;
using param_type = T;
using container_type = std::vector<T>;
};
int main() {
int a = A<int>::value; // a is initialized to 3
A<int>::number_type n = 0; // n is an int
A<int>::param_type p = 1; // p is an int
A<double>::param_type q = 2.5; // q is a double
A<double>::container_type v; // v is a std::vector<double>
}
(如示例所示,類模板的成員可以依賴於模板參數。)
在tuple_size<tupleType>::value
的情況下, value
是在tuple_size
結構內部定義的變量。 ::
含義類似於“查找在tuple_size結構內部定義的名稱值”。
vector <int>::iterator
。 iterator
在vector
類內部定義。
您可能會感到困惑,因為示例中的兩個外部類型都指定了模板參數。 看一下vector<int>
示例,這使迭代器( 在 vector類中定義)知道將要迭代的類型。 這就是為什么iterator
首先在vector
內部定義的原因。
對於tuple_size<tupleType>::value
這是元組中的參數數。 value
在這種情況下是在整數依賴於模板參數,以便它也有所述元組類中被定義。
范圍解析運算符僅指定在哪里查找名稱。 因此, tuple_size<tupleType>::value
意味着要在類tuple_size<tupleType>
查找名稱value
。 范圍解析並不關心名稱的含義,它只處理查找位置。
使用名稱的地方是確定該名稱是否有效的地方。
在第一種情況下,它在聲明中用作初始化程序,因此它必須命名一個有效值,否則編譯器將抱怨。 在第二種情況下,在聲明中使用它來命名類型( iterator
)。 同樣,一旦編譯器檢查了聲明並知道它應該是一個類型,便可以檢查它確實是類型。
當然,這只是一個簡單的簡化。 在模板的定義中,這些名稱取決於模板參數,其含義可以更改。 因此,我們必須明確指定期望這些名稱的名稱,如此處所述 。
tuple_size<tupleType>
和vector<int>
是模板類。 模板參數tupleType
和int
是類定義的一部分,這意味着vector<double>
例如是完全不同的類。
這就是為什么必須包括它們才能解決范圍的原因。
最后,它與訪問像class::member
這樣的簡單類成員沒有什么不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.