这听起来很无知,但是:
我在python解释器(RHEL 5.3上的python 2.4)上工作了一下,突然发现自己处于"vi命令模式"的状态.也就是说,我可以使用典型的vi键绑定编辑以前的命令,左边用h,用x删除...
我喜欢它 - 唯一的是,我不知道我是如何到达这里的(也许是通过我导入的其中一个模块:pylab/matplotlib?).
任何人都可以解释如何在解释器中启用此模式?
我正在寻找一种方法来获得非POD性质的C++类数据成员的偏移量.
原因如下:
我想以HDF5格式存储数据,这似乎最适合我的材料(数值模拟输出),但它可能是一个相当C的库.我想通过C++接口来使用它,这需要我申报存储类型像这样,(从文件在这里和这里(第4.3.2.1.1)):
class example {
public:
double member_a;
int member_b;
} //class example
H5::CompType func_that_creates_example_CompType() {
H5::CompType ct;
ct.insertMember("a", HOFFSET(example, member_a), H5::PredType::NATIVE_DOUBLE);
ct.insertMember("b", HOFFSET(example, member_b), H5::PredType::NATIVE_INT);
return ct;
} //func_that_creates_example_CompType
Run Code Online (Sandbox Code Playgroud)
其中HOFFSET是使用offsetof的HDF特定宏.
问题当然是,只要示例类变得更有用,它就不再是POD类型,因此使用offsetof将给出不确定的结果.
我能想到的唯一解决方法是首先将我想要存储的数据导出到更简单的结构,然后将其传递给HDF.然而,这确实涉及数据复制,这正是HDF试图避免的(以及为什么他们有这个CompType使得库能够到达你的对象以将他们的数据保存到文件中).
所以我希望你有更好的想法.理想情况下,我会为这个问题寻找一个可移植的解决方法,但如果没有,你可以给我一个适用于x86和x86_64与GCC的想法,我已经非常感激了.
-----后来添加:-----
Greg Hewgill建议在下面将数据存储在一个简单的结构中,然后通过继承来构建实际的类.特别是对于HDF,我认为这可能实际上不起作用.比上面更精细的使用场景:
class base_pod {
public:
double member_a;
int member_b;
}; //class base_pod
class derived_non_pod : private base_pod {
public:
//the following method is only virtual to illustrate the problem
virtual double get_member_a() {return member_a; }
}; //class …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚为什么以下不起作用.我有一个std :: vector,我想调用它的静态成员函数包含value_type,如下所示:
std::vector<Vector> v;
unsigned u = v.value_type::Dim();
Run Code Online (Sandbox Code Playgroud)
其中Vector实际上是模板化类型的typedef:
template <typename T, unsigned U> class SVector;
typedef SVector<double, 2> Vector; //two-dimensional SVector containing doubles
Run Code Online (Sandbox Code Playgroud)
静态成员函数Dim()实际上内联了Vector的维数U.
现在,编译器返回一条错误消息:
error: ‘SVector<double, 2u>’ is not a base of
‘std::vector<SVector<double, 2u>, std::allocator<SVector<double, 2u> > >
Run Code Online (Sandbox Code Playgroud)
这让我很困惑.我可以替换明显有问题的线路
unsigned u = Vector::Dim();
Run Code Online (Sandbox Code Playgroud)
这是有效的,但显然是丑陋的,因为它硬编码关于v的value_type的假设...谢谢!