小编dru*_*rus的帖子

boost :: asio :: streambuf - 如何重用缓冲区?

我正在实现TCP服务器,它同时使用asio socket.async_read()和boost :: asio :: async_read_until()方法从socket中异步读取数据.两者都使用相同的处理程序从boost :: asio :: streambuf读取数据.

完全通过async_read()调用的处理程序:

void handle_read(const boost::system::error_code& ec, std::size_t ytes_transferred) )
{
    m_request_buffer.commit(bytes_transferred);
    boost::asio::streambuf::const_buffers_type rq_buf_data = m_request_buffer.data();
    std::vector<uint8_t> dataBytes(boost::asio::buffers_begin(rq_buf_data), boost::asio::buffers_begin(rq_buf_data) + bytes_transferred);

    //process data here

    m_request_buffer.consume(bytes_transferred);
    bytes_transferred = 0;
}
Run Code Online (Sandbox Code Playgroud)

我的服务器取决于数据处理可能会关闭连接或继续通过相同的套接字读取.

但是,如果从第2次boost :: asi :: async_read_until()调用调用handle_read(),我会在dataBytes中得到一些零,然后有效数据就会出现.

我尝试了一个简单的测试用例,发现在向streambuf和commit()+ consume()写入数据之后,streambuf中的数据仍然保留了先前的缓冲区.

那么,有没有办法清除boost :: asio :: streambuf中的数据并在boost :: asio :: async_read_until()中重用它?

住Coliru

如果使用USE_STREAM = 1编译,则实时示例正常工作.但是什么std :: istream与缓冲区消耗()相比有什么不同?

c++ boost boost-asio

5
推荐指数
1
解决办法
7391
查看次数

C++ SFINAE:is_constructible for const char [] vs std :: string

我正在尝试禁用具有非std :: string可构造类型的ctor.我的第一次尝试是这样的:

#include <iostream>

struct A
{
    template <typename U, typename = typename std::enable_if<std::is_constructible<std::string, U>::value>::type>
    A(U&& val)
    {
        std::cout << "A(std::string&& val)" << std::string(std::forward<U>(val)) << std::endl;
    }

    template <typename U, typename = typename std::enable_if<not std::is_constructible<std::string, U>::value>::type>
    A(U&& val)
    {
        std::cout << "A(int&& val)" << val << std::endl;
    }
};

int main()
{
    A a1(1);
    A a2("hello");
    A a3(std::string("hello"));
}
Run Code Online (Sandbox Code Playgroud)

但编译失败了

A a1(1);

带有以下错误消息:

错误C2535:'A :: A(U &&)':已定义或声明的成员函数(实例).

这意味着,SFINAE的两个条件都成功,并且两个ctors都被使用.

我继续前进并尝试了以下方法:

#include <iostream>

struct A
{
    template <typename U> …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae

3
推荐指数
1
解决办法
275
查看次数

linux:从终端分离后,将标准输出关闭或重定向到/ dev/null

我们有一个linux代码,可以根据http://www.itp.uzh.ch/~dpotter/howto/daemonize上的实现从终端分离.

这是一个代码片段:

....
freopen( "/dev/null", "r", stdin);
freopen( "/dev/null", "w", stdout);
freopen( "/dev/null", "w", stderr);

kill( parent, SIGUSR1 );
}
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式关闭标准文件描述符,而不是重定向到/ dev/null,并获得相同的结果:

close(STDIN_FILENO);     
close(STDOUT_FILENO); 
close(STDERR_FILENO);
Run Code Online (Sandbox Code Playgroud)

现在,我对使用什么方法有点困惑:重定向还是关闭?每种方法的潜在问题是什么?

c linux terminal daemon dev-null

2
推荐指数
1
解决办法
1417
查看次数

将lambda注入模板方法的参数

我正在尝试实现类似的东西boost::static_visitor,让模板函数接受lambda并支持以下API:

int i1 = Apply([](int i) { return i; }); // doesn't compile
int i2 = Apply([]() { return 10; });     // ok
bool b1 = Apply([]() { return true; });  // ok
Apply([]() { return; });                 // ok
Run Code Online (Sandbox Code Playgroud)

问题是这个主题的延续.实施

template <typename Function, typename Return = std::result_of_t<Function()>,
    typename = typename std::enable_if<!std::is_same<Return, void>::value>::type>
Return Apply(Function func)
{
    std::cout << "invoked via Return(*)(...)" << std::endl;
    return func();
}

template <typename Function, typename Return = std::result_of_t<Function()>, 
    typename = typename …
Run Code Online (Sandbox Code Playgroud)

c++ lambda templates sfinae

2
推荐指数
1
解决办法
165
查看次数

标签 统计

c++ ×3

sfinae ×2

templates ×2

boost ×1

boost-asio ×1

c ×1

daemon ×1

dev-null ×1

lambda ×1

linux ×1

terminal ×1