既然代码比文字更能说明问题,你会使用下面的代码:
struct StringEvent
{
const void* source;
const std::string str;
StringEvent(const void* source, const std::string& str)
: source(source), str(str)
{ }
};
class StringEventListener
{
public:
virtual void handler(const StringEvent& event) = 0;
}
class Test : public StringEventListener
{
public:
void handler(const StringEvent& event)
{
std::cout << event.str << std::endl;
}
}
class EventSource
{
public:
EventSource(StringEventListener* listener)
{
listener->handler(StringEvent(this, std::string("foo")));
}
}
int main()
{
Test test;
EventSource(&test);
}就为了这个?
class Test
{
public:
void handler(const std::string& str)
{
std::cout << str << std::endl;
}
};
class EventSource
{
public:
EventSource(const boost::function<void (const std::string&)>& funcPtr)
{
funcPtr(std::string("foo"));
}
};
int main()
{
Test test;
EventSource(boost::bind(&Test::handler, &test, _1));
}要使类EventSource调用test.handler("foo"),请执行以下操作
我来自Java/C#世界,我发现第一种方法更直观,尽管冗长,但它是否建议在现实生活中使用,或者它是否会造成比其价值/性能影响更多的问题?
发布于 2012-12-16 21:40:57
我绝对不会使用第一个版本。那太可怕了。第二个版本要好得多-它可以是lambdas或者诸如此类的东西。
此外,boost::function也不是函数指针。
发布于 2012-12-16 21:38:02
在Boost/C++中,你可以使用'functors‘(带有静态方法的对象)来保存回调数据,还有一个回调对象(在前面的例子中)。
这是一个风格问题,如果你需要对象来传递数据。
https://stackoverflow.com/questions/13901716
复制相似问题