首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将成员函数赋值给使用std::function定义的成员变量?

如何将成员函数赋值给使用std::function定义的成员变量?
EN

Stack Overflow用户
提问于 2017-02-22 05:38:41
回答 4查看 3.7K关注 0票数 3

这是我的精简程序,我试图在运行时使用函数变量来修改类的功能。所以-我使用std::function模板声明了一个成员变量m_func,并用兼容的签名声明了一个函数myFunc

代码语言:javascript
复制
#include <functional>
#include <iostream>

struct T
{
  T():m_func([](int){return true;}) {}
  void assign() {m_func = &T::myFunc;}    // <======== Problem is here
  void call(int M) const {std::cout << m_func(M) << std::endl;}
private:
  bool myFunc(int N) {return (N >= 4);}
  using func = std::function<bool(int)>;
  func m_func;
};

int main()
{
  T t;
  t.assign();
  t.call(6);
}

然而,编译器(带-std=c++11选项的g++ 4.8.4 )给我一个长输出的错误,告诉我template argument deduction/substitution failed和更多...

为什么不能将myFunc函数赋给m_func变量?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-02-22 05:46:27

代码语言:javascript
复制
void assign() {m_func = &T::myFunc;}

成员函数指针有一个隐式的this指针,需要将其作为签名中的第一个参数传递。要么先使用std::bind绑定它,

代码语言:javascript
复制
void assign() {
    m_func = std::bind(&T::myFunc, this, std::placeholders::_1);
}

或者使用lambda表达式(捕获this)。

代码语言:javascript
复制
void assign() {
    m_func = [this](int arg){ return this->myFunc(arg); };
}
票数 2
EN

Stack Overflow用户

发布于 2017-02-22 05:45:59

不能将非静态成员函数指针直接赋给std::function。这个问题的一般解决方案是将this指针绑定到一个lambda中,如下所示:

代码语言:javascript
复制
void assign() { 
    m_func = [this](int N) { 
        return this->myFunc(N); 
    };
}

在您的例子中,将myFunc设为静态似乎更简单。

代码语言:javascript
复制
struct T
{
    T() :m_func([](int) {return true; }) {}
    void assign() { m_func = &T::myFunc; }
    void call(int M) const { std::cout << m_func(M) << std::endl; }
private:
    static bool myFunc(int N) { return (N >= 4); }
//  ^^^^^^ static methods can be assigned to std::function directly
    using func = std::function<bool(int)>;
    func m_func;
};
票数 5
EN

Stack Overflow用户

发布于 2017-02-22 05:41:44

如果希望在当前对象上调用成员函数,则需要:

代码语言:javascript
复制
m_func = std::bind(&T::myFunc, this, std::placeholders::_1);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42378499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档