看下面代码,回答问题: 变量x的数据类型是什么?
#include <iostream>
#include <vector>
class A {
private:
struct index {
struct inner {
int n;
};
inner *newInner() {
return new inner;
}
};
public:
index i;
};
int main() {
A a;
auto x = a.i.newInner();
std::cout << typeid(x).name() << std::endl;
return 0;
}
其实我也不知道,这要是在C99中是不会这么使用的,但是代码的确可以编译过去?引申问题,如果实用vector保存变量x的类型的数据集合?代码如下:
#include <iostream>
#include <vector>
class A {
private:
struct index {
struct inner {
int n;
};
inner *newInner() {
return new inner;
}
};
public:
index i;
};
int main() {
auto x = a.i.newInner();
x->n = 10;
std::cout << typeid(x).name() << std::endl;
std::vector<decltype(a.i.newInner())> vecInner;
vecInner.push_back(a.i.newInner());
vecInner.push_back(a.i.newInner());
vecInner[0]->n = 10;
vecInner[1]->n = 11;
for (auto p : vecInner) {
std::cout << p->n << std::endl;
}
return 0;
}
需要实用 decltype 关键字。
以上代码请参考:C++对象模型之RTTI的实现原理, C++11新特性之auto&decltype
这个问题有个根本性的问题,C++语言是如何实现private,protected和public?其实C++本质上都是一些指针,数据类型只是一种格式,如果从这点理解,我认为上面的代码是有效的,就个人而言,我是不赞成这么写代码的,这段代码的原型我从EOSIO中的智能合约部分看到的。
再多说两句,C++真的太复杂了,而且容易让人觉得自己到底是在学习语言,还是在学一门工具做业务。学C++还是需要多一点的耐性,而且还需要一点想象力,如果单纯说语言,我觉得可以学一门函数式语言,因为函数式编程的方式更通用点,需要什么就自己写一个语言,便于实现自己的业务,缺点就是,这玩意只能自己玩玩。