gpt4 book ai didi

c++ - 如何使用 std::mem_fun 传递参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:17 28 4
gpt4 key购买 nike

我想知道是否可以使用 std::mem_fun 传递参数?我想准确地说,我可以有尽可能多的参数和很多成员函数。
问题是我使用的是旧标准,我正在寻找一种完整的 STL 方式,因此即使我知道我可以轻松做到,也不允许将 boost 作为答案 =/

这是我想如何使用它的一个小例子:

#include <list>
#include <algorithm>

// Class declaration
//
struct Interface {
virtual void run() = 0;
virtual void do_something(int) = 0;
virtual void do_func(int, int) = 0;
};

struct A : public Interface {
void run() { cout << "Class A : run" << endl; }
void do_something(int foo) { cout << "Class A : " << foo << endl; }
void do_func(int foo, int bar) { cout << "Class A : " << foo << " " << bar << endl; }
};

struct B : public Interface {
void run() { cout << "Class B : run" << endl; }
void do_something(int foo) { cout << "Class B : " << foo << endl; }
void do_func(int foo, int bar) { cout << "Class B : " << foo << " " << bar << endl; }
};

// Main
//
int main() {
// Create A and B
A a;
B b;

// Insert it inside a list
std::list<Interface *> list;
list.push_back(&a);
list.push_back(&b);

// This works
std::for_each(list.begin(), list.end(), std::mem_fun(&Interface::run));

// But how to give arguments for those member funcs ?
std::for_each(list.begin(), list.end(), std::mem_fun(&Interface::do_something));
std::for_each(list.begin(), list.end(), std::mem_fun(&Interface::do_func));
return 0;
}

最佳答案

通过 std::bind1ststd::bind2nd 使用 std::bind

std::for_each(list.begin(), list.end(),
std::bind2nd(std::mem_fun(&Interface::do_something),1) // because 1st is this
);

不幸的是,该标准对两个参数版本没有帮助,您需要自己编写:

struct MyFunctor
{
void (Interface::*func)(int,int);
int a;
int b;

MyFunctor(void (Interface::*f)(int,int), int a, int b): func(f), a(a), b(b) {}

void operator()(Interface* i){ (i->*func)(a,b);}
};

std::for_each(list.begin(), list.end(),
MyFunctor(&Interface::do_func, 1, 2)
);

Lambda 版本

最初的答案是在 2012 年,当时 Lambda 刚刚被添加到标准中,而且很少有编译器符合 C++11。现在 8 年过去了,大多数编译器都兼容 C++11,我们可以使用它来简化这些事情。

// Binding 1 parameter
std::for_each(list.begin(), list.end(),
[](auto act){act->do_something(1);})

// Binding 2 parameters
std::for_each(list.begin(), list.end(),
[](auto act){act->do_func(1, 2);})

关于c++ - 如何使用 std::mem_fun 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9713477/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com