gpt4 book ai didi

c++ - 模板化 boost::bind 以自动处理成员函数的多个参数

转载 作者:太空狗 更新时间:2023-10-29 21:08:15 25 4
gpt4 key购买 nike

我有一个带有“附加”函数的类,它接受一个函数对象并将其存储到一个集合中。该类本身是在函数签名上模板化的。像这样:

template<class Signature>
class Event
{
public:

void Attach(boost::function<Signature> signature)
{
MySignatures.push_back(signature);
}

private:

std::list<boost::function<Signature>> MySignatures;
};

为了演示用法,请考虑以下类:


class Listening
{
public:

int SomeFunction(int x, int y, int z);
};

要将Listening 上的函数传递给Event,我需要这样写:


Event<int(int, int, int)> myEvent;
Listening myListening;

myEvent.Attach(boost::bind(boost::mem_fn(&Listening::SomeFunction), &myListening, _1, _2, _3));

所以我没有针对可能容易出错的每种情况都这样做,而是编写了一组宏,如下所示:


#define EventArgument0(x, y) boost::bind(boost::mem_fn(x), y)
#define EventArgument1(x, y) boost::bind(boost::mem_fn(x), y, _1)
#define EventArgument2(x, y) boost::bind(boost::mem_fn(x), y, _1, _2)
#define EventArgument3(x, y) boost::bind(boost::mem_fn(x), y, _1, _2, _3)
#define EventArgument4(x, y) boost::bind(boost::mem_fn(x), y, _1, _2, _3, _4)

etc.

然后我可以写:


myEvent.Attach(EventArgument3(&Listening::SomeFunction, &myListening));

这更容易阅读(我认为)。现在回答我的问题:我该如何写:


myEvent.Attach(EventArgument(&Listening::SomeFunction, &MyListening));

甚至更好:


myEvent.Attach(&Listening::SomeFunction, &myListening);

,这样事件 Attach 将神奇地与 中包含的适当数量的参数正确绑定(bind)(在本例中为 int(int, int, int))?我愿意接受您在这里想到的任何模板元编程魔法。

谢谢。

编辑:原来我不需要 boost::mem_fn 这里,因为 boost::bind 是等价的,所以在我的宏中我可以使用:

bind(&MyClass::Hello, myClass, _1, _2, _3);

,而不是:

bind(mem_fn(&MyClass::Hello), myClass, _1, _2, _3);

但问题仍然存在:如何将 &MyClass::Hello 传递给事件类并使用模板重载来处理 _1_2_3 等是否由用于模板化 Event 类的函数原型(prototype)暗示?

最佳答案

在成员函数中为不同数量的参数重载Attach:

template<typename R,typename T,typename U>
void Attach(R (T::*pmf)(),U* p))
{
Attach(boost::bind(pmf,p));
}

template<typename R,typename T,typename U,typename A1>
void Attach(R (T::*pmf)(A1),U* p))
{
Attach(boost::bind(pmf,p,_1));
}

template<typename R,typename T,typename U,typename A1,typename A2>
void Attach(R (T::*pmf)(A1,A2),U* p))
{
Attach(boost::bind(pmf,p,_1,_2));
}

如果您还需要处理 const 成员函数,那么您将需要第二组重载。

关于c++ - 模板化 boost::bind 以自动处理成员函数的多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3521608/

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