我目前正在尝试将一些侦听器存储在std :: vector中,并在需要时调用它们。 我在基类中有以下定义:
class A
{
public:
virtual ~A();
typedef std::function< void( const A & ) > Listener;
std::vector< Listener > listeners;
void addListener( const Listener & listener)
{
this->listeners.push_back( listener );
}
}
我有一个简单的B类:
class B : public A
{
virtual ~B();
}
我想做的就是写一个这样的电话:
B b;
b.addListener( [] ( const & B ) { /* Do something */ } );
但是这并没有编译,出现以下错误:
error: no viable conversion from '<lambda at main.cpp:158:27>' to 'const Listener' (aka 'const function<void (const A &)>')
我目前正在使用dynamic_cast
避免这个问题,但这对我来说似乎是一件坏事,或者设计不好......
答案 0 :(得分:3)
首先考虑正常功能。仅仅因为A
和B
是相关类型并且您可以在它们之间进行转换,这并不意味着函数void f(const A&)
和void g(const B&)
的类型是相关的,并且指针这些功能不能相互转换。
同样,SomeTemplate<A>
和SomeTemplate<B>
不是相关类型,也无法相互转换。
我希望现在std::function<void(const A&)>
和std::function(void(const A&)>
是不相关的类型而不能在彼此之间来回转换是有意义的。