代理成员访问
Proxy member access
是否有可能在访问类的成员时充当代理?最简单的方法当然是编写getter/setter,但这是不灵活和不优雅的,因为你必须自己编写所有的setter,这会使代码膨胀。
问题是我想抽象掉一些数据存在于微控制器程序中的事实。基本上我想要的是
MemberType member = object->member; // won't work if object lies in progmem
被翻译成类似
的内容MemberType member; // Allocate memory in RAM for the member
memcpy_P(&member,
&object->member, // assuming that this gives a valid pointer to the member
sizeof(MemberType));
在嵌入式C中,可以使用地址空间__flash
来做类似的事情。不幸的是,c++不支持这一点。
所以我考虑超载operator->()
。不幸的是,operator->()
没有得到任何信息,你将访问哪个成员(顺便说一句:为什么?->的唯一目的是访问成员,所以为什么有人想要丢弃这些信息呢?.
不能被覆盖。
->
。如果它是可能的一些深奥的模板结构,我会很高兴,以及。我不太懂c++,可能根本不可能。c++在元编程方面似乎有点不灵活。
编辑:从答案中得到灵感后,我现在决定使用包装器类并覆盖强制转换操作符。
template<typename Type>
class InProgmem {
Type const self; // InProgmem<Type> should be as big as Type
InProgmem(Type val) : self(val) {} // Keep the compiler quiet
public:
operator Type() const {
Type out;
memcpy_P(&out, this, sizeof(Type));
return out;
}
} __attribute__((packed));
// Example use:
PROGMEM prog_uchar foo = 14;
class Test {
public:
InProgmem<unsigned char> bar;
};
Test *baz = (Test*)&foo;
unsigned char bar = baz->bar;
您可以创建一个新的类ProgmemMemberType
,并定义一些赋值操作符来在内存空间之间进行转换。
const MemberType &MemberType::operator=(const ProgmemMemberType &other)
{
memcpy_P(this,
other.progMemPointer(),
sizeof(MemberType));
return *this;
}
const ProgmemMemberType &ProgmemMemberType::operator=(const MemberType &other)
{
// Whatever the reverse of memcpy_P is...
return *this;
}
那么你可以写MemberType member = object->member
或object->member = member
,赋值运算符将完成这项工作。
这是我能想到的最干净的解决方案;->
运算符并不是真正用于这类事情的。
当然,如果你不想为你使用的每一种类型都定义一个新的包装类,你可以使用模板类
相关文章:
- C++ 传递指向对象的指针的指针,无法访问成员
- 从不同C++类的成员变量访问成员函数
- 使用 getter 访问成员变量C++
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 通过多个类访问成员时出错
- 如何在使用对象指针时访问成员函数
- 为什么相应成员不能正确访问成员函数指针
- 从两个不同类继承的非虚拟基类的访问成员
- 如何使用 gcc 内联汇编器代码访问成员变量
- 如何使用常数向量访问成员函数
- 访问成员函数中参数的类成员
- C++嵌套结构初始化和访问成员
- 通过指向班级第一个成员的指针访问成员是不确定的行为吗?
- 如何使用C STD :: SET中的迭代器访问成员功能
- 访问成员C 时,结构的向量生成了范围的错误
- 带指针的班级访问成员
- 从聚合类访问成员变量
- 如何访问成员变量 sqlite 回调
- ctypes/C++segfault访问成员变量
- 通过父类型的指针或直接从派生类访问成员函数的差异