簡體   English   中英

關於在STL中使用范圍解析運算符的困惑

[英]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的值?

在這兩種情況下,合格名稱都用於命名類模板專業化的成員。 這可以用來命名靜態類成員。 而且, typedefusing別名可以出現在類定義或類模板定義中,並且類型別名被認為是該類的成員。

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 iteratorvector類內部定義。

您可能會感到困惑,因為示例中的兩個外部類型都指定了模板參數。 看一下vector<int>示例,這使迭代器( vector類中定義)知道將要迭代的類型。 這就是為什么iterator首先在vector內部定義的原因。

對於tuple_size<tupleType>::value這是元組中的參數數。 value在這種情況下是在整數依賴於模板參數,以便它也有所述元組類被定義。

范圍解析運算符僅指定在哪里查找名稱。 因此, tuple_size<tupleType>::value意味着要在類tuple_size<tupleType>查找名稱value 范圍解析並不關心名稱的含義,它只處理查找位置。

使用名稱的地方是確定該名稱是否有效的地方。

在第一種情況下,它在聲明中用作初始化程序,因此它必須命名一個有效值,否則編譯器將抱怨。 在第二種情況下,在聲明中使用它來命名類型( iterator )。 同樣,一旦編譯器檢查了聲明並知道它應該是一個類型,便可以檢查它確實是類型。

當然,這只是一個簡單的簡化。 在模板的定義中,這些名稱取決於模板參數,其含義可以更改。 因此,我們必須明確指定期望這些名稱的名稱,如此處所述

tuple_size<tupleType>vector<int>是模板類。 模板參數tupleTypeint是類定義的一部分,這意味着vector<double>例如是完全不同的類。

這就是為什么必須包括它們才能解決范圍的原因。

最后,它與訪問像class::member這樣的簡單類成員沒有什么不同。

暫無
暫無

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

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