c++ - 在 C++11 中将 std::function/mem_fn 与成员函数一起使用

标签 c++ c++11 lambda metaprogramming function-pointers

长话短说,是否有一种简单/定义的方式来以流线型方式处理函数对象/lambda 和成员函数?

如果我理解正确,如果我使用 std::mem_fn,我需要将正确类型的对象传递给函数调用,即

Object o;
ftncall std::mem_fun(&Object::function);
ftncall(o);

理想情况下,会有一些方法可以将 o“附加”到该函数对象,也许作为 std::weak_ptr,这样我们就知道 o 是否被删除了。例如,如果有一种方法可以像这样模糊地做一些事情:

Object o;
ftncall std::mem_fn(&Object::function, o); // Or maybe std::mem_fn<Object>
ftncall();

现在,显然,这不存在(据我所知)。有没有一种方法可以包装 std::mem_fn,使我不会失去 std::mem_fn 的通用性(和友好性),但可以“附加”o,并且仍然可以很好地播放使用其他函数类型,如 std::function?理想情况下,我仍然能够像使用 std::function 那样使用 operator()

目前我能想到的最好的解决方案是一个看起来像这样的类:

template<class T>
class MemFunWrapper {
public:
    MemFunWrapper(T* t, std::mem_fun funct) : m_t(t), m_function(funct) {}

    std::mem_fun operator*() { return m_function; }
    T* get() { return m_t; }
private:
    T* m_t;
    std::mem_fun m_function;
}

然后你可以这样使用它:

(*MemFunWrapper)(MemFunWrapper->get(), args...);

但这对我来说似乎很笨拙。另外,我必须为 std::function 创建一个等价的类才能以类似的方式使用它,这看起来很愚蠢,因为我已经可以只使用 std::function 了。理想情况下,我还可以在不知道调用的是成员函数还是常规函数的情况下使用最终产品。我知道我问了很多 - 任何方向都会有所帮助。非常感谢!

最佳答案

你要找的是 std::bind 而不是 std::mem_fn:

#include <iostream>
#include <functional>

struct Object
{
  void member()
  {
    std::cout << "yay!" << std::endl;
  }
};

int main()
{
  Object o;
  auto fn = std::bind(&Object::member, o);
  fn();
}

FWIW:有一个 proposal用于向 std::mem_fn 添加重载以接受包含在 C++14 中的对象。

关于c++ - 在 C++11 中将 std::function/mem_fn 与成员函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18584188/

相关文章:

c++ - 如何在 C++ 类中存储智能指针列表?

c++ - 删除指针导致内存泄漏?

c# - Web.config 运行时/legacyCorruptedStateExceptionsPolicy 设置不起作用

c++ - 我的 g++ 使用 vector<weak_ptr> erase() 方法生成奇怪的警告

c++ - 为什么我可以从 {} 初始化一个常规数组,而不是一个 std::array

c# - 如何通过比较将 lambda 表达式传递给 where 语句

java - 在 Lambda 表达式(Java)中,如何使用不带参数的表达式?

python - 为什么这个 lambda 函数比 for 循环版本更懒?

c++ - 无法执行 sqlite SQL 文件来创建数据库

c++ - session key - MSDN - Microsoft