的std ::功能< void(const A&)>无法强制转换为std :: function< void(const B&)>当B继承自A

时间:2014-10-06 15:35:35

标签: c++ c++11

我目前正在尝试将一些侦听器存储在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避免这个问题,但这对我来说似乎是一件坏事,或者设计不好......

1 个答案:

答案 0 :(得分:3)

首先考虑正常功能。仅仅因为AB是相关类型并且您可以在它们之间进行转换,这并不意味着函数void f(const A&)void g(const B&)的类型是相关的,并且指针这些功能不能相互转换。

同样,SomeTemplate<A>SomeTemplate<B>不是相关类型,也无法相互转换。

我希望现在std::function<void(const A&)>std::function(void(const A&)>是不相关的类型而不能在彼此之间来回转换是有意义的。