using boost::signals2::signal;
    controller :: { signal accepted_block;}

    class chain_plugin_impl {
    fc::optional chain;
    }
    //chain_plugin.cpp slot 函数 slot
    my->accepted_block_connection = my->chain->accepted_block.connect([ththis my- >accepted_block_channel.publish(blk);
    });

    channels::accepted_block::channel_type& accepted_block_channel;

    /** Publish data to a channel. This data is _copied on publish. _/

    void publish(const Data& data) {
    if (has_subscribers()) {
    // this will copy data into the lambda
    ios_ptr->post(this, data {
    _signal(data); // 调用slot
    });
    }
    }

    /** subscribe to data on a channel /
    template
    handle subscribe(Callback cb) {
    return handle(_signal.connect(cb));
    }

    boost::signals2::signal _signal;

    template< typename Tag, typename Data, typename DispatchPolicy = drop_exceptions >
    struct channel_decl {
    using channel_type = channel;
    using tag_type = Tag;
    };

    namespace channels {
    using accepted_block = channel_decl;
    }

    触发信号
    emit( self.accepted_block, pending->_pending_block_state );

    template
    void emit( const Signal& s, Arg&& a ) {
    try {
    s(std::forward(a));
    }
    }
    一个信号多个slot 对应
    //net_plugin slot 函数
    cc.accepted_block.connect( boost::bind(&net_plugin_impl::accepted_block, my.get(), _1));
    //producer_plugin slot 函数
    my->_accepted_block_connection.emplace(chain.accepted_block.connect( this{ my->on_block( bsp ); } ));

    //mongo_plugin slot 函数
    my->accepted_block_connection.emplace( chain.accepted_block.connect( & {
    my->accepted_block( bs );
    } ));