![](/img/trans.png)
[英]Access typedef in classes with an object, not the scope resolution operator (::)
[英]Scope resolution operator on object
在 C++ 中,我們有一個operator::
,它允許我們做這樣的事情:
typedef std::pair<A, B> pairAB;
pairAB p;
pairAB::first_type a(42);
pairAB::second_type b("hello world");
p.first = a;
p.second = b;
我試圖在這種類型的對象上使用這個運算符:
pairAB p2;
p2::first_type a2(42);
p2::second_type b2("hello again");
p2.first = a2;
p2.second = b2;
編譯器向我顯示了error: C2510: 'p2' : left of '::' must be a class/struct/union
,我想知道是否有任何技巧可以讓我這樣做?
如果您使用 GCC,則有一個 C++11 之前的等效項__typeof__
,其行為類似。 嘗試:
#include <string>
int main()
{
typedef std::pair<int, std::string> pairAB;
pairAB p2;
__typeof__(p2.first) a2 = 42;
__typeof__(p2.second) b2 = "hello again";
p2.first = a2;
p2.second = b2;
}
或者,如果您可以使用boost ,它會提供Boost.typeof ,它也應該適用於較舊的 Visual C++ 編譯器。
獲取變量的類型正是 c++11 中decltype
關鍵字的作用。
decltype(p2.first) a2 = 42;
在 c++11 之前,沒有標准的方法來做到這一點。 有一些特定於編譯器的功能,例如 gcc 的typeof
和基於庫的實現,例如 Boost.Typeof,它們在 c++11 之前就已經存在,並且可以做類似的事情。
不需要 C++11 特性,也不需要像 C++03 中的typeof
這樣的編譯器擴展,它們是不可移植的。 如果正在使用該變量,則其類型在某處可用 - 假設它是模板或函數簽名中的 T。
然后你可以簡單地typename T::first_type
因為pair
攜帶其成員類型的成員類型信息(就像許多其他 STL 類,如容器、 string
等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.