gpt4 book ai didi

c++ - 具有来自不同对象的函数的函数数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:07 25 4
gpt4 key购买 nike

我没有太多在 C++ 中使用函数数组的经验。我需要使用一个函数数组,其中该数组包含来自不同对象的函数。这是一些虚拟代码来说明我想要实现的内容。

class base_class
{
public:
virtual int function1(int arg1, int arg2);
virtual int function2(int arg1, int arg2);
};

class derived_class : public base_class
{
public:
int function1(int arg1, int arg2) { /* ... */ };
int function2(int arg1, int arg2) { /* ... */ };
// ...
};

typedef int (*functions) (int arg1, int arg2);

int main()
{
derived_class object1;
derived_class object2;

functions func_instance[4];
func_instance[0] = object1.function1;
func_instance[1] = object1.function2;
func_instance[2] = object2.function1;
func_instance[3] = object2.function2;
// ...
}

我无法让它工作,它抛出以下错误:

error: argument of type int () (int , int) does not match int (*) (int, int)

最佳答案

最简单的方法是使用 std::functionstd::bind

#include <functional>
#include <array>

derived_class object1;
derived_class object2;

std::array< std::function<int(int, int)>, 2> >
arr = {{ std::bind(&derived_class::function1, &object1)
, std::bind(&derived_class::function2, &object1)}};
// and so on

请注意,object1object2 已通过地址绑定(bind)。只要绑定(bind)的函数还活着,你就需要让它们保持活着。如果您只是在 bind 表达式中写入 object1,对象的拷贝将存储在绑定(bind)函数中,并且不会发生范围问题。

C++03 一个完整的示例,带有手动滚动的单一用途 Binder 类型:

#include <iostream>

struct base
{
virtual void f0() { std::cout << "f0 base" << std::endl; }
virtual void f1() { std::cout << "f1 base" << std::endl; }
};

struct derived : base
{
void f0() { std::cout << "f0 derived" << std::endl; }
void f1() { std::cout << "f1 derived" << std::endl; }
};

// typedef for a Pointer to a member function
// of base that accepts arguments and returns void
typedef void (base::*MemberPtrType)(void);

// we pack a pointer to a class and a pointer to a member function together
struct binder
{
MemberPtrType ptr;
base* base;

// shortcut to call this thing, you might also want
// to have an overload of operator() and a result_type typedef
void call()
{ ((base)->*(ptr))(); }
};


int main()
{
base b;
derived d;

// initialize a 4 element array of binder, the first argument is the function,
// the second is the object to call it on
//
// remember that b and d need to be alive as long as
// you want to call something in this array
binder arr[4] = { {&base::f0, &b}, {&base::f1, &b},
{&base::f0, &d}, {&base::f1, &d}};

// now walk through the array and call each
for(binder* begin = arr; begin != arr + 4; ++begin)
{
begin->call();
}


return 0;
}

关于c++ - 具有来自不同对象的函数的函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16537178/

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