小编Ale*_*llo的帖子

联合共享ptr

虽然发生了分段错误,但我想访问联合的共享ptr:

struct union_tmp
{
    union_tmp()
    {}
    ~union_tmp()
    {}
    union
    {
        int a;
        std::shared_ptr<std::vector<int>> ptr;
    };
};

int main()
{
    union_tmp b;
    std::shared_ptr<std::vector<int>> tmp(new std::vector<int>);
    b.ptr = tmp; //here segmentation fault happens
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误的原因是什么,我该如何避免?

c++ shared-ptr unions

7
推荐指数
2
解决办法
1446
查看次数

在g ++中使用std :: variant

我如何使用std::variant的g++?为什么没有std::variant在std::experimental(尽管std::optional是)?g++我需要什么版本?我不想使用boost,我只想使用标准库.

编辑:似乎只g++ 7支持std::variant.然后我的问题是:什么时候会发布,使用它的实验版本时会遇到什么问题?

c++ stl g++ variant

6
推荐指数
1
解决办法
3764
查看次数

使用 epoll_wait 和 signalfd 处理信号

我正在echo server使用套接字和系统调用编写自己的程序。我习惯epoll同时与许多不同的客户端一起工作,并且对客户端完成的所有操作都是非阻塞的。当服务器打开并且什么都不做时,它在epoll_wait. 现在我想添加使用信号关闭服务器的可能性。例如,我在 中启动服务器bash terminal,然后按ctrl-c,服务器以某种方式处理SIGINT. 我的计划是使用signalfd. 我使用以下代码创建新的signalfd并将其添加到epoll实例中:

    sigset_t mask;
    sigemptyset(&mask);
    sigaddset(&mask, SIGTERM);
    sigaddset(&mask, SIGINT);
    signal_fd = signalfd(-1, &mask, 0);

    epoll_event event;
    event.data.fd = signal_fd;
    event.events = EPOLLIN;
    epoll_ctl(fd, EPOLL_CTL_ADD, signal_fd, &event);
Run Code Online (Sandbox Code Playgroud)

然后我希望,当我在epoll等待并按下时ctrl-c,事件epoll发生,它唤醒,然后我使用以下代码处理信号:

    if (events[i].data.fd == signal_fd)
    {
        //do something
        exit(0);
    }
Run Code Online (Sandbox Code Playgroud)

虽然实际上服务器只是停止而不处理信号。我做错了什么,解决我的问题的正确方法是什么?如果我没有正确理解信号,应该使用的地方是什么signalfd?

c sockets signals epoll

6
推荐指数
1
解决办法
4473
查看次数

为什么std :: function在这种情况下不起作用?

想象一下我有一个类型:

struct my_type
{
    double operator()(int a)
    {
        return 3.1415;
    }
};
Run Code Online (Sandbox Code Playgroud)

然后我想把它包起来std::function.考虑两种不同的方法:

my_type m_t;
std::function<double(int)> f(std::move(m_t));
std::cout << f(4) << std::endl;
Run Code Online (Sandbox Code Playgroud)

如我所料,一切都很好,打印出PI的第一个数字.然后是第二种方法:

std::function<double(int)> ff(my_type()); 
std::cout << ff(4) << std::endl;
Run Code Online (Sandbox Code Playgroud)

在我看来,这个代码是完全一样的第一个.rvalue作为function包装器的参数传递.但问题是,第二个代码不能编译!我真的不知道为什么会这样.

c++ stl function most-vexing-parse c++11

4
推荐指数
1
解决办法
82
查看次数

无法在MPAndroidChart中为BarChart设置颜色

我想在设置酒吧的特定颜色BarChart的MPAndroidChart.我根据文档做了一切,但颜色没有变化.这是我的代码:

   barChart = (BarChart) findViewById(R.id.bar_chart);
   List<BarEntry> entries = new ArrayList<BarEntry>();
   entries.add(new BarEntry(1.0f, 10.0f)); //tmp values

   BarDataSet dataSet = new BarDataSet(entries, "bars");
   dataSet.setColor(R.color.red); //color from resourses

   BarData barData = new BarData(dataSet);

   barChart.setData(barData);
   barChart.invalidate(); 
Run Code Online (Sandbox Code Playgroud)

有趣的是,在我尝试改变条形颜色之前,条形图是蓝色的,在我试图改变它的颜色后,它变成了灰色(无论它必须是什么颜色).我不明白为什么颜色不会改变.我也尝试覆盖类中的getColor方法BarDataSet,但结果是一样的 - 条是灰色的.

灰色,但不是红色

android mpandroidchart

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