我正在尝试使用boost :: signal来实现一个回调机制,即使是最简单的库使用,我也会在boost :: signal代码中获得内存访问断言.我把它简化为这段代码:
#include <boost/signal.hpp>
typedef boost::signal<void (void)> Event;
int main(int argc, char* argv[])
{
Event e;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:这是使用Visual Studio 2008 w/SP1编译的Boost 1.36.0.Boost :: filesystem,像boost :: signal也有一个必须链接的库,它似乎工作正常.我相信,我使用的所有其他boost库都只是标题.
首先,我是编程的绝对初学者,所以不要嘲笑我太多.
我见过的唯一信号是GUI工具包,GUI工具包都带有自己的信号.那么,Boost:信号甚至可以与这些GUI工具包一起使用吗?这是个好主意吗?信号有哪些其他应用?
我知道为什么boost::signal是不可复制(这是因为复制的信号没有明确的含义),但我需要的是一个版本,它提供了一些分类复制构造函数的(或者无操作或一个副本的所有连接).
我需要这个的原因是因为在我的项目中,许多对象只是凭借特征信号变得不可复制,并且用舒适的价值语义对待它们(shared_ptrs 不那么舒服)我需要手动提供拷贝,违反DRY.显然,一种准可复制的信号对于C++的丑陋来说是一个很好的解决方法.
想到的第一个解决方案是继承signal并在派生类中提供复制ctor,但这是禁止的,因为信号没有虚拟dtor.
思考?
我有一个带有信号成员的类,用boost :: function封装.
是否可以使用此API添加另一个信号作为处理程序?
class Foo
{
public:
VOID AddHandler(boost::function<VOID()> handler)
{
m_signal.connect(handler);
}
private:
boost::signal<VOID()> m_signal;
};
boost::signal<VOID()> signal;
VOID SignalCaller()
{
signal();
}
int main( )
{
Foo foo;
//foo.AddHandler(signal); // I want to
foo.AddHandler(&SignalCaller); // I have to
}
Run Code Online (Sandbox Code Playgroud) 在过去的两个晚上,我一直在抨击我,试图弄清楚这一点并没有取得积极成果.每当我想要连接一个类的成员函数和另一个类的信号时,在增强信号中有一个东西,如果我想稍后断开连接,我必须将结果连接保存在一个变量中.如果以后,我想将相同的成员函数连接到其他类信号(成员函数仍然与前一个类信号连接)我必须保存这个新连接以便管理它.我的问题是,有什么方法可以避免这种情况吗?
我希望在我正在开发的小型教育框架中包含增强信号,但我不想添加所有内容,因为增强功能非常大,我需要的是线程,信号1和2以及asio.
我的问题是,由于没有完整的升级库,我可能会遇到任何依赖关系或许可问题?
class Whatever
{
public:
virtual ~Whatever();
protected:
Whatever();
virtual void SomeMethod();
void OnEventOccurred(int x);
std::vector<boost::signals2::scoped_connection> boostSignalConnections_;
}
Run Code Online (Sandbox Code Playgroud)
// .cpp
Whatever::SomeMethod()
{
...
boostSignalConnections_.push_back(
anObject->AddEventOccurredObserver(
std::bind(&Whatever::OnEventOccurred,
this, std::placeholders::_1)));
...
}
Run Code Online (Sandbox Code Playgroud)
(注意AddEventOccurredObserver只委托boost::signals2::connect()并返回boost::signals2::connection)
我收到以下错误.很难解释模板错误,但似乎错误是在成员声明中引起的std::vector<boost::signals2::scoped_connection> boostSignalConnections_;
...\vc\include\xmemory(202): error C2248:
'boost::signals2::scoped_connection::scoped_connection' :
cannot access private member declared in class 'boost::signals2::scoped_connection'
...\boost_1_47\boost\signals2\connection.hpp(234) : see declaration of
'boost::signals2::scoped_connection::scoped_connection'
...\boost_1_47\boost\signals2\connection.hpp(210) :
see declaration of 'boost::signals2::scoped_connection'
...\vc\include\xmemory(201) : while compiling class template member function
'void std::allocator<_Ty>::construct(boost::signals2::scoped_connection *,_Ty &&)'
with
[
_Ty=boost::signals2::scoped_connection
] …Run Code Online (Sandbox Code Playgroud) 我正在使用boost库,我的问题是关于boost :: signals.
我有一个信号可能会调用许多不同的插槽,但只有一个插槽将匹配该调用,所以我希望这个特定的插槽返回true并且调用将停止.
可能吗?
它有效吗?
如果效率不高,你们可以建议我更好的方法吗?
我的系统在构建boost库时遇到了问题.据我所知,大多数boost库(幸运的是)只是不需要构建的头文件(有一些例外).是否需要构建boost :: signals2库?boost.signals2库是否依赖于boost.signals库?
构建以下函数时出现构建错误:
template <class T> class Event {
public:
typedef boost::signal<void (void*, const T)> signal_t;
typedef boost::signals::connection connection_t;
public:
Event() { }
connection_t connect(signal_t::slot_type subscriber){
return signal.connect(subscriber);
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
error: 'class boost::signal<void ()(void*, T), boost::last_value<typename boost::function_traits<void ()(void*, T)>::result_type>, int, std::less<int>, boost::function<void ()(void*, T)> >::slot_type' is not a type
Run Code Online (Sandbox Code Playgroud)
我认为这与它的模板化事实有关,但我不确定如何解决它.我试过添加,这样
connection_t connect(signal_t::slot_type<T> subscriber)
Run Code Online (Sandbox Code Playgroud)
但这只是产生了另一个错误.