2

我想知道以下情况是否可能。

我有一个类A,它有一些数据成员,其中一个是容器(假设一个简单的数组)。

现在对于 的构造函数A,我想传递一个 lambda 函数来初始化类的数据成员。我希望用户能够编写自己的初始化例程并将其应用于类。

例如,考虑这个A带有 2 个参数的构造函数。第一个是数组的大小,第二个是 lambda 函数。

A(std::function<void (self_type)> f) {
    f(*this);
}

现在我将创建一个对象,如下所示:

A a([](A a) {
    //do something here to initialize array and data members
});

这样,用户就可以执行自己的初始化,而不是使用类提供的构造函数或其他填充函数。

这可能使用一些技巧吗?如果我能以某种方式this在 lambda 函数中使用,那就更好了。

例如 -

A a([]() {
    //do something here to initialize array and data members
    this->_n = 100; // where _n is some data member.
});

欢迎任何可能的解决方案!

4

1 回答 1

0

一般来说,如果一个类保持成员私有,它会对这些成员的状态强制执行一个不变量。如果你让 J. Random User 戳你的私人空间,你不知道他会保持这个不变性。所以我不确定这在设计上是否是个好主意。

也就是说,您可以通过将所有相关数据成员作为公共成员放在私有基类中来实现这样的目的:

struct A_base {
  int something;
  std::string some_other_thing;
};

class A : private A_base {
public:
  A(std::function<void(A_base&)> f) { f(*this); }
  template <typename Function>
  A(Function&& f) { std::forward<Function>(f)(*this); }
};

这提供了对用户功能所需的访问权限,但显然没有使用this.

于 2013-07-28T02:54:27.207 回答