gpt4 book ai didi

c++ - 模板化类的模板化成员的函数句柄

转载 作者:行者123 更新时间:2023-11-28 07:57:35 26 4
gpt4 key购买 nike

如何在模板化类中创建对模板化函数的函数回调。这是我目前所拥有的:

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_;

}

我在使用 g++ 时遇到以下错误

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

第186行是

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

最佳答案

您不能使用指向(成员)函数模板的指针,因为它还不存在。一种解决方案是移动 Handler类型参数为 NettyPBSslSerializer (所以 NettyPBSslSerializer<SocketType, HandlerType> )然后绑定(bind) &NettyPBSslSerializer::async_read_varint ...

编辑:

其实很简单。您不能使用指向成员函数模板的指针,但您可以构建一个闭包,该函数模板将在其中以正确的类型实例化并将结果传递给 boost::async。 .这是一个 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);
}

关于c++ - 模板化类的模板化成员的函数句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12356461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com