【问题标题】:Send method as parameter发送方法作为参数
【发布时间】:2019-09-30 20:41:24
【问题描述】:

如果不使用std::bind,我就是找不到调用类方法的方法,因为我需要在tryfoo中使用参数调用这个方法。

//simple function  
uint16_t getreg(const uint8_t& num)  
{  
    return 0;  
}  

假设在 ClassItem 类中我们有公共方法

uint16_t ClassItem::getregI(const uint8_t &f)  
{  
    return 1;  
}  

带有可调用函数的函数

void tryfoo (const uint8_t &param, std::function<uint16_t (const uint8_t&)> f)  
{  
// let's suppose that param= got some other value here  
    uint16_t result = f(param);  
}  

void basefunction(ClassItem &A)  
{  
   tryfoo (0, getreg); // Why it's OK  
   tryfoo (0, A.getregI) // And this's NOT  ?
}

【问题讨论】:

  • 这不行,因为 C++ 设计者是这样设计的。
  • std::bind 有什么问题?
  • 是的,我不明白问题是什么。 OP,您是否只是在问为什么语法 A.getregI 不等于 std::bind
  • @Acorn 我误解了 std::bind 的工作方式,但现在一切都变得清晰了。

标签: c++ class methods std-function


【解决方案1】:

这是因为std::function 为一个指针* 保留空间,仅此而已。只传递一个普通函数是可能的,因为它适合一个指针的空间。这对于来自对象的成员函数是不可能的,因为您必须同时存储指向函数的指针和指向对象的指针,并且您不能将两个指针放入一个指针的空间中(至少,不安全)。

因此,您必须使用std::bind 构建一个单独的对象并将指向该对象的指针传递给该对象。您可以将指针传递给成员函数而无需绑定到像tryfoo (0, ClassItem::getregI); 这样的对象,但那不会访问A 对象。

*:这方面的细节很模糊,但总体观点仍然成立。

【讨论】:

  • std::function 不仅仅是一个指针。事实上,它的大小几乎是无限的(在不同实现的编译时和运行时,如果您将分配视为有效大小的一部分)。
  • @Acorn 看我的脚注,这是给新程序员的解释
  • 如果std::function 只是一个指针,我们为什么不直接使用函数指针呢?
  • @VladSamara 或者,您可以使用 lambda 代替:tryfoo (0, [&amp;](const uint8_t &amp;param){ A.getregI(param); }); std::bind() 几乎不推荐使用代替 lambdas
  • @randomusername 相反,它实际上为您管理事情,包括为需要/绑定的任何状态分配内存。 std::function 实际上是为了简化这一点而设计的,并提供了一种保存任何可调用对象的方法。什么意思?
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 2021-10-10
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多