小编Roc*_*net的帖子

创建类似 Windows 资源管理器的目录树

目前,我正在使用 wxWidgets 的 wxGenericDirCtrl,它为我提供了目录树的用户界面。它看起来像这样:

wxGenericDirCtrl

但是,我希望它看起来像这样:

Windows 资源管理器目录树

在与 wxWidgets 开发人员交谈时,他们建议一种好的方法是修改 wxGenericDirCtrl 类以使用本机 Windows 目录控件。我想自己将此功能贡献给 wxWidgets,但我不确定从哪里开始,并且可以使用一些建议来帮助我开始。

问题:

  1. 在 C++ 中创建此类控件的正确本机方法是什么?我使用 MFC、.NET 还是其他语言?
  2. 有没有关键字可以帮助我找到这些信息?
  3. 有任何示例代码显示如何执行此操作吗?

c++ winapi wxwidgets windows-shell

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

我需要一个稍微不同的多图

我正在寻找一个C++容器类,这很像多图,但略有不同.容器将存储成对的字符串.但是当我使用键K从容器中检索项目时,我想找到K以项目自己的键开头的所有项目.

EG如果我使用键"abcde",我想找到带有"adc"和"abcde"键的项目,而不是"abcqz".

或者以伪C++形式:

multimap2<string, string>  myMultiMap;
myMultiMap.insert( pair("abcde", "hello"));
myMultiMap.insert( pair("abc",   "Hi"));
myMultiMap.insert( pair("abcqz", "goodbye"));

// prints 2
cout << myMultiMap.count("abcde") << endl;

// prints "hello"  and  "Hi"
cout << myMultiMap.everything_which_matches("abcde") << endl;

// prints "Hi"
cout << myMultiMap.everything_which_matches("abc") << endl;

// prints "goodbye"
cout << myMultiMap.everything_which_matches("abcqz") << endl;
Run Code Online (Sandbox Code Playgroud)

插入时间并不重要,但我需要快速访问这些项目.是否可以通过创建一个特殊的<运算符来使用普通的Multimap执行此操作?我的预感是我需要普通的<操作符进行插入,还需要一个特殊的操作符进行检索.

谢谢

雨果

c++ string multimap data-structures

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

如何在C中打开4个字符的字符串?

我需要根据4个字符的字符串进行切换.我把字符串放在一个联合中,所以我至少可以把它称为32位整数.

union
{
    int32u  integer;
    char    string[4];
}software_version;
Run Code Online (Sandbox Code Playgroud)

但现在我不知道在案例陈述中写什么.我需要某种宏来将4个字符的字符串文字转换为整数.例如

#define STRING_TO_INTEGER(s)    ?? What goes here ??
#define VERSION_2_3_7           STRING_TO_INTEGER("0237")
#define VERSION_2_4_1           STRING_TO_INTEGER("0241")

switch (array[i].software_version.integer)
{
    case VERSION_2_3_7:
        break;

    case VERSION_2_4_1:
        break;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法制作STRING_TO_INTEGER()宏.或者有更好的方法来处理交换机?

c string macros switch-statement

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

我可以使用placement new添加到矢量

我有一个MyClass向量,其中MyClass是一个大类.当我做:

vector<MyClass> vec;
vec.push_back(MyClass(a,b,c));
Run Code Online (Sandbox Code Playgroud)

这似乎效率很低,因为创建了一个临时的MyClass,将其复制到向量中,然后进行了破坏.

有没有办法在第一个地方使用placement new直接在vector中创建类?我不能这样做:

vector<MyClass> vec;
vec.resize(1);
new(&vec.data[0]) MyClass(a,b,c);
Run Code Online (Sandbox Code Playgroud)

因为vec.resize(1)调用了MyClass构造函数.是否有某种方法可以调整向量的大小而不调用所有新项的构造函数,或者是否可以在下一个可用位置将MyClass直接构造到向量中?

c++ performance constructor vector placement-new

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

lambda 存储在哪里?

这是C++ lambda 的寿命是否有限的后续问题?。

在我之前的问题中,尝试在 lambda 超出范围后使用它会导致崩溃。虽然这并不奇怪,但我认为我使用了 lambda 存储位置的错误思维模型,这让我认为它永远存在,即使它超出了范围。

也许是因为我经常使用微控制器,其中代码从非易失性闪存执行,这与数据存储器(例如堆栈)完全分开。但我想象创建 lambda 相当于显式编写一个独立函数,但语法更方便。IE:

void SaySomething()
{
    cout << "Hello" << endl;
}

int main()
{
    AcceptFunction([](){cout << "Hello" << endl;});    // I thought that this
    AcceptFunction(SaySomething);                    // was the same as this
}
Run Code Online (Sandbox Code Playgroud)

我想象的是 lambda 编译为与其他非 lambda 代码一起静态存在的实际代码,并AcceptFunction传递一个指向该代码的指针。在这种情况下,该代码将始终存在于内存中,即使 lambda 超出范围也是如此。

但我的程序崩溃了,所以这不可能是真的。那么该代码在哪里?它在堆栈上吗?如果是这样,在具有闪存的架构(代码无法从堆栈中运行)上,行为是否会有所不同?

更新

请注意,这个问题是关于 lambda 的物理存储位置。我不希望行为有所不同,也不希望 lambda 的析构函数不被调用。

c++ lambda c++11

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