1

假设我有以下模板。

template<typename T>
class MyClass
{
public:
    .............
private:
   T _data;
}

当我使用它时,T 始终是一个结构(仅限数据)。例如,

struct ST1{
    int a;
    int b;
};
struct ST2{
    int a1;
    int b1;
    int c1;
}

对于 MyClass 的特定实例,例如 ,MyClass<struct ST1> myinstance我想访问myinstance.data.amyinstance.data.b。我能想到的一种通用方法是在 MyClass 中定义方法,例如

void MyClass::write(T const &){ _data = T;}
T    MyClass::read(){return _data;}

但问题是,对于每次读写,我都需要创建一个结构实例,即使我只访问_data.

谢谢

4

2 回答 2

1

怎么样...

const T& MyClass::GetData() const { return _data; }
T& MyClass::GetData() { return _data; }

然后你可以做...

myClass.GetData().a = 17;

你也可以_data公开。

于 2013-06-13T18:36:03.777 回答
1

您应该做的第一件事是考虑_data公开。如果它只是数据,并且它不是活动的,并且暴露其二进制布局不是问题,那么这是可行的。

如果您希望能够“预订”访问_data(例如,使用互斥锁,或远程获取/设置某些信息),并且您可以访问 C++11 lambda,则此模式可能很有用:

template<typename Lambda>
auto Data( Lambda&& closure )->decltype( closure(_data) ) {
  // do pre-processing
  auto retval = closure(_data);
  // do post-processing
  return retval;
}
template<typename Lambda>
auto Data( Lambda&& closure ) const->decltype( closure(_data) ) {
  // do pre-processing
  auto retval = closure(_data);
  // do post-processing
  return retval;
}

你会这样使用:

int main() {
  MyClass<Foo> instance;
  int x = instance.Data( [&]( Foo const& foo ) {
    return foo.x;
  });
  instance.Data( [&]( Foo& foo ) {
    foo.y = 3;
  });
}

它使您可以在“内部”包装代码中操作MyClass.

在 C++14 lambda 出现之前,这有点尴尬auto,因为您必须重复Foo.

这种风格的一个好处是,MyClass它甚至不必存储Foo! 它可以Foo按需生成,然后从用户更改的内容中读取。

于 2013-06-13T19:22:33.253 回答