小编Jus*_*n G的帖子

C++ 11 lambda捕获实际捕获了多少?

我在多个示例中看到,您可以使用单个字符捕获多个变量,如下所示:

Rect rect;
Point point;

auto someLambda = [&](const SomeType& var)
{
    if (rect.Contains(point))
    {
        var.Something();
    }

    this->MemberFunction();
};
Run Code Online (Sandbox Code Playgroud)

这最终会抓住rectpoint通过引用获得访问权限this,但它实际捕获了多少?它只捕获它需要的变量,还是从字面上捕获当前范围内的所有变量?

我在其他示例中看到,您还可以指定要捕获的各个变量:

Rect rect;
Point point;

auto someLambda = [this, &rect, &point](const SomeType& var)
{
    if (rect.Contains(point))
    {
        var.Something();
    }

    this->MemberFunction();
};
Run Code Online (Sandbox Code Playgroud)

这样或那样做有什么好处吗?我曾与之合作的人曾提到过使用"全部捕获" [&]版本的价格更贵,但我找不到任何文件来支持这一点.我只想确切地知道,所以我不会让代码变得比它需要的更复杂,或者做一些我不应该做的昂贵的事情.

c++ performance lambda c++11

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

用于在距离另一个点一定距离的2D网格上查找所有点的算法

我在2D网格(x,y)上有一些观点,我需要找到距离该点n个距离的所有点.我测量距离的方法是使用两点之间的距离公式.有人知道怎么做吗?

编辑:仅供参考,我正在尝试做的是编写一些AI路径查找,它将与使用基于网格的位置的系统中的目标保持一定距离.目前我正在使用A*路径查找,但我不确定这是重要还是有所不同,因为我对这些东西不熟悉.

grid 2d point distance

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

非模板类中任何类型的C++成员变量

有没有办法在类中存储模板或自动变量而不使类成为模板?我正在尝试存储指向其中一个STL随机数生成器的指针,但是如果不将整个类放入模板中,我无法想出任何方法.这不是一个选项,因为将cpp中的所有内容移动到h文件会导致大量的循环头文件包含我不想处理的内容.所以例如它会是这样的:

class tSomeClass
{
    public:
        template<typename RNG>
        tSomeClass(RNG * rng) : fRNG(rng) { }

    private:
        RNG * fRNG; // How do I get this working???
};
Run Code Online (Sandbox Code Playgroud)

到目前为止,我提出的所有内容总是需要将整个课程作为模板,所以我很难过.

编辑:我知道我忘了提一些东西.我不能使用继承来指定RNG类型,因为我不知道基数是什么,除非有人知道STL使用的RNG的基类是什么.目前我正在使用std :: default_random_engine.

c++ templates class member

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

使用ImageMagick ++修改图像对比度/亮度

我试图将对比度和亮度应用于内存中的位图,我完全迷失了.目前我正在尝试使用Magick ++来实现它,但如果其他API中的一个能够更好地工作,我会全力以赴.我设法找到Magick :: Image :: sigmoidalContrast()来应用对比度,但我无法弄清楚如何让它工作.我正在创建一个图像,传递它的缓冲区指针,然后调用该函数,但它似乎并没有改变任何东西,所以我的第一个虽然是它正在复制并修改它.即便如此,我也不知道如何从Magick :: Image对象中获取数据.

这是我到目前为止所得到的.

Magick::Image image(fBitmapData->mGetTextureWidth(), fBitmapData->mGetTextureHeight(), "RGBA", MagickCore::CharPixel, pixels);
image.sigmoidalContrast(1, 20.0);
Run Code Online (Sandbox Code Playgroud)

文档是无用的,搜索后我只能找到第一个参数实际上是布尔值的提示,即使它需要size_t,指定是否添加或减去对比度,第二个值是我不知道该怎么做通过所以我只是用20.0来测试.

那么有谁知道这是否适用于对比,如果没有,那么你如何应用对比?同样,我仍然不知道如何应用亮度,也找不到任何看起来像他们会工作的功能.

c++ imagemagick bitmap brightness contrast

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

LoadLibraryW()无法在System32中加载DLL

我正在尝试使用以下代码加载在C:\ Windows\System32 \文件夹中安装了打印机驱动程序的DLL:

LoadLibraryW(L"C:\\Windows\\System32\\MagAPI.dll");
Run Code Online (Sandbox Code Playgroud)

GetLastError()报告"无法找到指定的模块".如果我将DLL移动到System32文件夹之外(例如C:\ SomeFolder\MagAPI.dll),那么它将加载正常,因此它似乎不是DLL本身的问题.是否有一些奇怪的Windows安全功能可能阻止我的应用程序加载它?这是我唯一能想到的,但我找不到任何明确的答案.

这是ShowSnaps的调试输出,它显示了它失败的地方:

1a8c:1fd4 @ 19006756 - LdrLoadDll - ENTER: DLL name: C:\Windows\system32\MagAPI.dll DLL path: C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpLoadDll - ENTER: DLL name: C:\Windows\system32\MagAPI.dll DLL path: C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpLoadDll - INFO: Loading DLL C:\Windows\system32\MagAPI.dll from path C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpFindOrMapDll - ENTER: DLL name: C:\Windows\system32\MagAPI.dll DLL path: C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpSearchPath - ENTER: DLL name: C:\Windows\system32\MagAPI.dll DLL path: C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpResolveFileName - ENTER: …
Run Code Online (Sandbox Code Playgroud)

c++ dll loadlibrary system32

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

查找圆的内部矩形的大小

我有一个圆,例如半径为10,并且由于其宽度和高度等于半径,我可以很容易地找到外部边界矩形,但是我需要的是内部边界矩形。有谁知道如何从圆的外部和内部边界矩形计算大小差异?

这是一张图片,用来说明我在说什么。我知道,红色矩形是圆的外部边界框。黄色矩形是该圆的内部边界矩形,我需要找出与外部矩形的大小差异。

圈子的例子

我发现差异的第一个猜测是找到内矩形的四个点之一,方法是沿着圆的圆周找到该点,每个点的偏移量为45度,然后找出与该点不同的点大矩形的相关点。

编辑:基于史蒂夫·B给出的解决方案。我想出了算法来得到我想要的是以下内容:

r*2 - sqrt(2)*r
Run Code Online (Sandbox Code Playgroud)

geometry bounding rect

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

StretchDIBits仅在特定图像尺寸下失败

我正在使用StretchDIBits打印图像,当图像由于某种未知原因而处于特定大小时,它会失败.

图像数据从24位BGR格式的某些其他图像源加载到unsigned int数组中.我已经验证了图像和缓冲区完全没问题,因为就像我说的那样,它可以在某些尺寸上工作但根本不工作.

我正在测试的当前尺寸是638x1014.如果我将高度更改为1013它可以正常工作,但由于某种原因,如果它是1014,它就会失败.

这里有一些代码向您展示如何设置它们:

unsigned int * buffer = new unsigned int[width * height * 3];

// Fill buffer with image data...

BITMAPINFOHEADER bi = { 0 };
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = width * height * 3; // Specifying this value because if I don't it will crash trying to read outside of the buffer.

StartPage(hdcPrint);
SetMapMode(hdcPrint, MM_ISOTROPIC);
SetWindowExtEx(hdcPrint, width, height, …
Run Code Online (Sandbox Code Playgroud)

c++ windows crash gdi stretchdibits

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