【问题标题】:Is there a way to attach a callback to C++ object member?有没有办法将回调附加到 C++ 对象成员?
【发布时间】:2013-12-04 10:25:13
【问题描述】:

上下文:我的 C++ 经验大约是 3/10,请耐心等待。

我很想知道是否可以将读取回调函数附加到 C++ 对象成员,以便在分配时:

var = object.member;

这会调用一个回调,在返回之前更新成员。我可以通过

达到同样的目的
...
var = object.GetMemberVal();
...
int FooClass::GetMemberVal()
{
    // update member value
    return this->member;
}

但是 val = object.member; (没有括号)更简洁一些,似乎更接近面向对象的精神......我认为。

我认为member function as callback 可能是相关的,但我并不完全关注。

这是否是一个好主意可能会引起争论,我只是想知道它是否可能。

【问题讨论】:

  • object.member = var 怎么样?在这种情况下应该怎么办?
  • 嗯,你可以,但这是一个 hack 并且不实用,你可以创建一个类来重载 = 运算符并为左成员或右成员调用回调。您还需要知道 member 它属于哪个实例...

标签: c++


【解决方案1】:

如果我理解你的正确,你可能想使用std::bind

auto myGetMemberVal = std::bind(&FooClass::GetMemberVal, object);

// ...

int value = myGetMemberVal();  // Actually calls object.GetMemberVal()

std::bind 函数创建一个可调用对象,该对象将调用您告诉它的函数。

【讨论】:

    【解决方案2】:

    Borland C++ Builder 有类似的东西,称为 property,但它不是标准 C++ 功能。

    使用标准 C++,您可以创建一个模板类来包装成员并至少实现以下功能:

    • operator T :用于读取值。 T 是成员的类型(例如 int)
    • operator = :用于写入值

    对于简单的内置类型,它相当简单。

    如果您希望该成员只是一个 int 并且您只想直接访问它(没有包装器),那么您不能这样做。

    【讨论】:

      【解决方案3】:

      这对您的事业有帮助吗:

      #include <iostream>
      
      
      typedef int (*func)(int,int);
      
      int f1(int x,int y)
      {
        return x+y;
      }
      
      class A{
      
        int _x;
        int _y;
        int _z;
      
        public:
      
        A(int num1,int num2):_y(num1),_z(num2){}
      
        void set ( int (*f)(int x,int y))
        {
          _x = (*f)(_y,_z);
        }
      
        int get ()
        {
          return _x;
        }
      
      };
      
      int main()
      {
        A instance(11,1);
        instance.set(f1);
        std::cout<<instance.get()<<std::endl;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 2021-05-15
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        相关资源
        最近更新 更多