对象上的范围解析运算符
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,则有一个名为 __typeof__
的 C++11 之前的等效项,其行为类似。尝试:
#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, it provides Boost.typeof,它应该也适用于较旧的 Visual C++ 编译器。
获取变量的类型正是 decltype
关键字在 c++11 中的作用。
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
, ...).
在 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,则有一个名为 __typeof__
的 C++11 之前的等效项,其行为类似。尝试:
#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, it provides Boost.typeof,它应该也适用于较旧的 Visual C++ 编译器。
获取变量的类型正是 decltype
关键字在 c++11 中的作用。
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
, ...).