在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
,我想知道是否有任何技巧可以让我这样做?
答案 0 :(得分:1)
如果您正在使用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,则它提供Boost.typeof,它也适用于较旧的Visual C ++编译器。
答案 1 :(得分:1)
获取变量的类型正是c ++ 11中query.setParamter("fist_name", "%name%");
关键字的用途。
decltype
在c ++ 11之前,没有标准的方法可以做到这一点。有一些编译器特定的功能,例如gcc的decltype(p2.first) a2 = 42;
和基于库的实现,例如Boost.Typeof,它们在c ++ 11之前就存在并且做了类似的事情。
答案 2 :(得分:-1)
C ++ 03中不需要C ++ 11特性和编译器扩展,如typeof
,这些扩展不可移植。如果正在使用该变量,则其类型在某处可用 - 例如,它在模板或函数签名中为T.
然后你可以简单地typename T::first_type
,因为pair
携带自己的成员类型的成员类型信息(与容器,string
等许多其他STL类一样)。