小编Ziv*_*ivS的帖子

在shared_ptr的自定义删除器中检查nullptr是否有意义?

我已经看到一些std::shared_ptr与自定义删除器一起使用的代码,该自定义删除器测试nullptr的参数,例如,MyClass它有一个close()方法并且由一些构造CreateMyClass:

auto pMyClass = std::shared_ptr<MyClass>(CreateMyClass(), 
                                        [](MyClass* ptr)
                                        { 
                                            if(ptr) 
                                                ptr->close(); 
                                        });
Run Code Online (Sandbox Code Playgroud)

ptr在删除器中测试null-ness 是否有意义?这会发生吗?怎么样?

c++ shared-ptr c++11

13
推荐指数
2
解决办法
1836
查看次数

获取当前的笔记本电脑盖状

我正在写一个C#应用程序(专门用于笔记本电脑),我想知道盖子的状态,即何时打开以及何时关闭.

我已经在这个SO答案的帮助下使用了pInvoke和Microsoft的RegisterPowerSettingNotification函数.

因此,有了上述内容,我知道当盖子关闭或打开并知道其状态时,但我想在其他任何事情继续之前获得盖子的状态.我注意到即使盖子没有变化,也会调用回调函数,我可以检查它的参数以了解盖子的状态,但这对我来说不好,因为它是一个事件,我不能简单地等待为了它发生(也许有另一种方法来解决这个问题?).

我也尝试过PowerEnumerate功能,但无法从中得到一些东西(也许有一些我不知道的东西可以提供帮助)

编辑1:我不能等待或延迟应用程序,并且有2个问题要求我获得没有CB的状态,首先是在笔记本电脑连接到显示器时可以关闭盖子从而允许用户使用笔记本电脑.如果用户在这种情况下启动应用程序,则无法启动.第二个原因是我希望应用程序对用户友好并通知启动或停止时会发生什么,如果我在错误的时间得到cb,可能会被忽略,因为应用程序的内部逻辑,然后必须等到下一次我得到一个cb,我一点都没有.

那么,(没有双关语意)有没有办法立即得到这些信息?

编辑2:从评论看来,我不清楚我需要什么.我需要一种方法来查询盖子的状态.即 - 调用一些API或其他东西,返回值是状态.谢谢!

关键字:GUID_LIDSWITCH_STATE_CHANGE,WM_POWERBROADCAST,电源设置

c# c++ winapi

9
推荐指数
1
解决办法
2473
查看次数

C++ 11 std ::转发指针

我的Signal应用程序中有一个类,它为类提供了一个公开事件的选项(与.NET中相同).

班级工作,一切都很好.

昨天我看到了这个问题(及其答案)并且熟悉了std::forward.

我决定尝试在我的代码中使用它,所以我改变了每一个std::function<void(Args...)>std::function<void(Args&&...)>,并在提高功能(operator())我使用了我在上面的链接所以现在该功能将看到同样的逻辑Args&&...args和回调用途std::forward<Args>(args)...

这是我的Signal类的简化版本(通过一些更改使其成为一个很好的例子):

template<typename... Args> class Signal
{
public:
    int operator+=(const std::function<void(Args&&...)>& func)  {
        int token = getNewToken();
        m_subscribers.emplace(token, func);
        return token;
    }

    void operator()(Args&&... args) {
        for (auto it : m_subscribers) {
            it.second(std::forward<Args>(args)...);
        }
    }

private:
    std::map<int, std::function<void(Args&&...)>> m_subscribers;
};

int main() {
    int* six = new int(6);
    int seven = 7;

    Signal<int*> e1;
    e1 += [](int* x) { std::cout << *x; …
Run Code Online (Sandbox Code Playgroud)

c++ std c++11

8
推荐指数
1
解决办法
1559
查看次数

使用变量否定“is”运算符仅适用于“!” 但不是 '== false'

为什么(expr is type varname) == false会出现编译错误,但可以!(expr is type varname)编译?

public static void Foo(object o)
{
    if(!(o is string s))  // <-- Using '!'
    {
        return;
    }
    
    Console.WriteLine(s);  // <-- OK
    
}
public static void Bar(object o)
{
    if((o is string s) == false) // <-- Using '== false'
    {
        return;
    }
    
    Console.WriteLine(s);  // <--Error: Use of unassigned local variable 's'
}
Run Code Online (Sandbox Code Playgroud)

现场示例:https : //dotnetfiddle.net/nYF7b6

.net c# compiler-errors operators

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

C++ Bitflaged 枚举到字符串

当您将鼠标悬停在按位枚举(或无论如何称呼)变量(在调试时)上时,我试图通过获取枚举并将其转换为字符串来执行 Intellisense 在 Visual Studio 中所做的操作。

例如:

#include <iostream>

enum Color {
    White = 0x0000,
    Red = 0x0001,
    Green = 0x0002,
    Blue = 0x0004,
};

int main()
{
    Color yellow = Color(Green | Blue);
    std::cout << yellow << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您将鼠标悬停在上面,yellow您会看到:

在此输入图像描述

所以我希望能够调用类似的东西:

std::cout << BitwiseEnumToString(yellow) << std::endl;
Run Code Online (Sandbox Code Playgroud)

并输出打印:Green | Blue

我编写了以下内容,试图提供打印枚举的通用方法:

#include <string>
#include <functional>
#include <sstream>

const char* ColorToString(Color color)
{
    switch (color)
    {
    case White:
        return "White";
    case Red:
        return "Red";
    case …
Run Code Online (Sandbox Code Playgroud)

c++ enums bit-manipulation bitflags

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

是否可以使用CLion调试Linux核心(转储)文件?

我在网上找不到任何东西,似乎可以使用Windows来完成,但对于Linux则什么也不能完成。

我希望能够打开一个核心转储文件和调试它(使用它的源和二进制文件)使用克利翁的调试器,你一样可以用QtCreator调试。可能吗?如果不是,是否有人知道他们是否打算添加此功能?

linux core clion

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

std::call_once 是阻塞调用吗?

std::call_once在代码中仅使用一次来初始化一些共享变量。调用代码位于由多个线程触发的回调内。我有兴趣知道,因为我在文档中找不到它,所以std::call_once本质上是否是阻塞的,就好像有一个std::lock_guard相反?实际情况看起来确实如此。

例如,以下内容将在调用"Done"之前打印:print()

#include <future>
#include <iostream>
#include <thread>
#include <mutex>

std::once_flag flag;

void print()
{
    for(int i=0;i<10;i++)
    {
          std::cout << "Hi, my name is " << std::this_thread::get_id() 
            << ", what?" << std::endl;
    }
}

void do_once()
{
    std::cout << "sleeping for a while..." << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
    std::cout << "Done" << std::endl;
}

void work()
{
    std::call_once(flag, [](){ do_once(); });
    print();
}


int main()
{
    auto handle1 = std::async(std::launch::async, work);
    auto handle2 …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading std c++11

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

Git排除具有特定名称的目录,除了一个

我已经看到了一些类似于这个的问题并且还阅读了gitignore手册,但仍然无法想出这一个.

我想要排除所有命名lib的文件夹(我的规则"lib/"),除了单个文件夹(将来可能更多),这是第三方文件夹,我无法更改其名称,这是在<root>/3rdparty/projectX/lib/.

我试过这个:

!lib/
lib/*
!projectX/lib/
Run Code Online (Sandbox Code Playgroud)

但是这还包括其他文件夹,其中包含不在root下的lib文件夹

是否可以将此文件夹添加为例外?怎么样?

git gitignore

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

调用printf时隐式转换为char*

我在我的C++ GUI应用程序中使用Unicode字符串作为图标,并希望摆脱u8"\uf118"我所散布的所有魔术字符串,并且在途中,使这些字符串成为他们自己的类型.

所以我创建了一个这样的类:

struct icon
{
    explicit constexpr icon(const char (&unicode_icon)[4]) :
        _icon{ unicode_icon[0], unicode_icon[1], unicode_icon[2], unicode_icon[3] }
    {
    }
    operator const char*() const
    {
        return _icon.data();
    }
private:
    std::array<char, 5> _icon;
};
Run Code Online (Sandbox Code Playgroud)

GUI库使用某种形式printf(我认为vfprintf)所以代码调用:

icon smiley { u8"\uf118" };
printf("%s", smiley);
Run Code Online (Sandbox Code Playgroud)

我到目前为止在Windows上对此进行测试并且效果很好,但是当我使用gcc(5.1)在Linux上编译它时,我收到以下警告:

main.cpp:22:24: warning: format '%s' expects argument of type 'char*', but argument 2 has type 'icon' [-Wformat=]
     printf("%s", smiley);
Run Code Online (Sandbox Code Playgroud)

这里有实例

当我运行它时,我在内部遇到了一个seg故障,vfprintf因为它没有使用我提供的强制转换运算符.

我知道当我将图标传递给GUI库时,我可以显式地转换图标(它有以下原型,(const char* fmt, ...)但这会让我写更多的代码,而且,它看起来会更糟.

有没有办法让编译器发挥魔力并允许我像这样调用函数:( printf("%s", smiley);或其他一些简单的方法)?

c++ printf gcc variadic-functions c++11

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

cpp:使用省略号捕获异常并查看信息

我知道你可以捕获"所有异常"并打印异常

try
{
    //some code...
}catch(const std::exception& e) {
   cout << e.what();
}
Run Code Online (Sandbox Code Playgroud)

但这仅适用于从std :: exception派生的异常.我想知道是否有办法从省略号捕获中获取一些信息

try
{
    //some code...
}catch(...) {
   // ??
}
Run Code Online (Sandbox Code Playgroud)

如果机制与函数的省略号相同,那么我应该能够执行类似的操作va_list并尝试调用what()方法.

我还没有尝试过,但如果有人知道我会很高兴知道如何.

c++ try-catch ellipsis variadic

3
推荐指数
2
解决办法
706
查看次数