简体   繁体   English

模板类的模板成员的函数句柄

[英]function handle to templated member of templated class

How do I create a function callback to a templated function in a templated class. 如何在模板化类中创建对模板化函数的函数回调。 Here is what I have so far: 这是我到目前为止的内容:

template <typename SocketType> 
class NettyPBSslSerializer {
    ...
    template <typename Handler>
    void async_read(google::protobuf::Message *pbmess,Handler handler ) {
            void (NettyPBSslSerializer<SocketType>::*f1)(
                    const boost::system::error_code&,std::size_t offset,google::protobuf::Message *pbmess,boost::tuple<Handler>)
                    =&NettyPBSslSerializer<SocketType>::async_read_varint <Handler> ;

            boost::asio::async_read (socket_,
                                     boost::asio::buffer(&read_buffer_.at(0), 9),
                                     boost::asio::transfer_at_least(1),
                                     boost::bind(f1,this,boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, pbmess,boost::make_tuple(handler) )
                                    );
    }
    template <typename Handler>
    void async_read_varint(const boost::system::error_code& e, std::size_t offset,google::protobuf::Message *pbmessp, boost::tuple<Handler> handler) {
    }

    ....
    SocketType socket_; 

}

I get the following error using g++ 我使用g ++收到以下错误

  nettypbserializer.hpp|186| error: expected primary-expression before '>' token
  nettypbserializer.hpp|186| error: expected primary-expression before ';' token

line 186 is 186行是

=&NettyPBSslSerializer<SocketType>::async_read_varint <Handler> ;

You can't take a pointer to a (member) function template, since it does not exist yet. 您不能使用指向(成员)函数模板的指针,因为它尚不存在。 One solution would be to move the Handler type parameter to NettyPBSslSerializer (so as NettyPBSslSerializer<SocketType, HandlerType> ) and then just bind &NettyPBSslSerializer::async_read_varint ... 一种解决方案是将Handler类型参数移动到NettyPBSslSerializer (例如NettyPBSslSerializer<SocketType, HandlerType> ),然后仅绑定&NettyPBSslSerializer::async_read_varint ...

EDIT: 编辑:

It's actually quite easy. 实际上很容易。 You can't take a pointer to member function template, but you can build a closure, where this function template will be instantiated with the correct type and pass the result to boost::async . 您不能使用指向成员函数模板的指针,但是可以构建一个闭包,其中将使用正确的类型实例化此函数模板,并将结果传递给boost::async Here's a conceptual implementation : 这是一个概念上的实现

#include <iostream>

namespace boost {
    template <typename Stream, typename Handler>
    void async_read(Stream p_Stream, Handler p_Handler)
    {
        p_Handler();
    }
}

template <typename SocketType>  
class NettyPBSslSerializer { 
    SocketType m_Socket;

        template <typename Handler> 
        void async_read_varint(Handler handler) {
                handler();
        } 
public:
        template <typename Handler> 
    void async_read(Handler handler) {
        boost::async_read(m_Socket, [&]() -> void {
            this->async_read_varint(handler);
        });
        } 

    NettyPBSslSerializer(SocketType const & p_Socket) : m_Socket(p_Socket) {}
};

void a_handler()
{
    std::cout << "a_handler called" << std::endl;
}

int main()
{
    NettyPBSslSerializer<int> tTmp(42); 

        tTmp.async_read(a_handler);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM