【问题标题】:Initialize object with lambda function in C++在 C++ 中使用 lambda 函数初始化对象
【发布时间】:2013-07-28 02:06:14
【问题描述】:

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

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

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

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

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

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

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

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

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

例如-

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

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

【问题讨论】:

  • 一个 lambda 函数可以做任何其他函数可以做的任何事情,有些人甚至会说他们有更多的功能,因为变量捕获
  • 是的,但我无法访问班级的私人成员。有没有办法让我可以访问它?此外,我将无法在 lambda 函数中使用 this(考虑到当前情况。我必须在函数调用中显式传递 *this(这是我目前能看到的唯一方法)。跨度>
  • 然后您可以使用 setter 和 getter,或者让用户将 lambdas 传递给执行此操作的另一个函数
  • 我想做的是直接访问会员。它只是在对象初始化期间。 Getter 和 setter 可能不会一直存在于所有数据成员(可能受到限制)。我有自己的类,我想做的就是直接向用户提供初始化机制。这可能吗?
  • 为什么宁愿让用户传递初始化函数而不是让用户传递数据成员的值?

标签: c++ c++11 lambda


【解决方案1】:

一般来说,如果一个类保持成员私有,它会对这些成员的状态强制执行一个不变量。如果你让 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 的语法能力。

【讨论】:

  • 这确实给了我一些想法。虽然我不希望按原样合并设计。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多