在访问它的成员时,某个类是否可以作为代理?最简单的方法当然是编写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->()
没有得到任何你要访问的成员的信息(顺便说一句:为什么wtf? - >的唯一目的是访问一个成员,所以为什么有人想把这些信息扔掉?)。 .
根本无法覆盖。
有人知道如何解决这个问题吗?当然,语法不必是->
。如果有可能使用一些深奥的模板构造,我也会很高兴。我不知道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;
答案 0 :(得分:1)
您可以创建一个新类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
,并且赋值运算符将完成工作。
这是我能想到的最干净的解决方案; ->
运算符并不是真正意义上的。
当然,如果您不想为您使用的每种类型定义新的包装类,则可以使用模板类。