2013-06-04 54 views
0

当某个类访问成员时,它在某种程度上是否可以充当代理?最简单的方法当然是编写getters/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->()没有得到你要访问的成员的任何信息(btw:为什么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; 

回答

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->memberobject->member = member和赋值运算符将做的工作。

这是我能想到的最干净的解决方案; ->运营商并不真正意味着这种事情。

当然,如果您不想为每个使用的类型定义新的包装类,则可以使用模板类。

+0

谢谢。这对我来说不起作用,因为我打算包装像int这样的原始类型,但是我给了我正确的灵感。我只是使用一个虚拟包装模板类,并重写了演员操作。 – Ferio