小编Gyo*_*ely的帖子

std :: function的模板参数如何工作?(实现)

Bjarne Stroustrup的主页(C++ 11 FAQ)中:

struct X { int foo(int); };

std::function<int(X*, int)> f;
f = &X::foo; //pointer to member

X x;
int v = f(&x, 5); //call X::foo() for x with 5
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?std :: function如何调用foo成员函数

模板参数int(X*, int),是&X::foo从转换成员函数指针到一个非成员函数指针?!

(int(*)(X*, int))&X::foo //casting (int(X::*)(int) to (int(*)(X*, int))
Run Code Online (Sandbox Code Playgroud)

澄清:我知道我们不需要使用任何指针来使用std :: function,但我不知道std :: function的内部如何处理成员函数指针非成员函数之间的这种不兼容性指针.我不知道标准如何允许我们实现像std :: function这样的东西!

c++ templates function-pointers function-object c++11

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

OpenCV将Canny边缘转换为轮廓

我有一个OpenCV应用程序来自办公室内部的网络摄像头流(很多细节),我必须找到一个人工标记.标记是在白色背景的一个黑角规.我使用Canny来查找边缘和cvFindContours进行轮廓加工,然后使用aboutPolyDP和co.用于过滤和查找候选者,然后使用局部直方图进一步过滤,bla bla bla ...

这或多或少有效,但不完全是我想要的.FindContours总是返回一个闭环,即使Canny创建一个非闭合线.我得到一个轮廓走在线的两侧形成一个环.对于坎尼图像(我的标记)上封闭的边缘,我得到2个轮廓,一个在里面,和其他在外面.我不得不对这个操作有问题:

  • 我为每个标记得到2个轮廓(不是那么严重)

  • 最简单的过滤是不可用的(拒绝非闭合轮廓)

所以我的问题是:是否可以为非封闭的Canny边缘获得非闭合轮廓? 或者解决上述两个问题的标准方法是什么?

Canny是一个非常好的工具,但我需要一种方法将2D黑白图像转换为易于处理的东西.类似连接组件的东西,列出组件的步行顺序中的所有像素.所以我可以过滤循环,并将其提供给approxPolyDP.

更新:我错过了一些重要的细节:标记可以处于任何方向(它不是面向摄像机的正面,没有直角),实际上我正在做的是3D方向估计,基于标记的2D投影.

opencv image-processing

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

混合libstdc ++版本

有两个软件团队为同一个OS(Scientific Linux 6.5)开发C++应用程序:

Team_A使用操作系统提供的编译器和库(GCC 4.4.7,GLIBC_2.12,GLIBCXX_3.4.13)来构建其C++ 98应用程序和各种共享库.

Team_B使用较新的GCC版本(4.8.3),该版本是从源代码构建的.它是一个本机编译器,它链接到OS libc,并使用OS标准头,但有自己的stdc ++版本(GLIBCXX_3.4.19).Team_B在C++ 11模式下使用此编译器来构建其应用程序(AppB),并将libstdc ++和libgcc_s与它一起部署.

Team_A以共享库(.so,.hpp)的形式向Team_B提供服务:LibA.该库的API是一组C++类(标头中的声明,.so中的实现),并且这些方法将std :: string和其他stdc ++类作为参数.

此时我们遇到了问题:AppB构造了GLIBCXX_3.4.19 C++ 11样式std ::无论什么对象并将它们传递给LibA,后者将它们解释为GLIBCXX_3.4.13 C++ 98样式对象,这可能不是向前兼容的.

这是一个问题吗?它会导致应用程序崩溃吗?std ::的任何实现是否兼容版本(相同的内存布局)?那么c ++ 98和C++ 11呢?

一些情节曲折使我更加困惑:

  • AFAICT,当AppB运行时,只有一个libstdc ++加载,更新的.即使LibA与旧版本链接,也不会加载.
  • 但是libstdc ++中的符号是版本化的.因此,如果LibA明确使用旧版本的符号,它将与之相关联.这意味着AppB和LibA将使用相同功能的2种不同实现.
  • std :: string和contains是模板类,这意味着它们的实现的一部分最终会在它生成的地方生成,其中一部分在libstdc ++中.所以.即使加载了较新的libstdc ++,LibA中生成的模板代码也是旧版本.

我想了解在这种情况下究竟发生了什么,如果它有风险,并且无效问题.让团队处于相同的开发环境不是一种选择.从API中删除std :: classes也很难.

欢迎任何指示!:)

c++ gcc c++11

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

封闭的资源在 Java 中应该如何表现?

我有一个在内部保存 Closeable 资源的 java 类。这意味着我的类还实现了 Closeable 接口并在其自己的 close() 方法中关闭了内部资源。

我的类关闭的预期行为是什么,通常是 Java 中的任何关闭对象?我看到该对象处于失效状态,其内部结构已关闭,但客户仍对其有引用。IMO 访问它是一个编程错误,但错误会不时发生,因此即使在这种情况下,行为也应该是合理的......

我是不是该?

  • 在所有方法调用上抛出异常,例如:IllegalState
  • 像什么都没发生一样闭上眼睛,让异常通过关闭资源?

什么是规范的 Java 方式?

java autocloseable

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

std :: function/bind就像没有标准C++库的type-erasure一样

我正在基于发布/订阅模式在C++ 11中开发一个简单的事件驱动的应用程序.类具有onWhateverEvent()由事件循环调用的一个或多个方法(控制反转).由于应用程序实际上是一个固件,其中代码大小至关重要且灵活性不是高优先级,'subscribe'部分是一个带有事件ID和相关处理程序的简单表.

这是一个非常简化的想法代码:

#include <functional>

enum Events {
    EV_TIMER_TICK,
    EV_BUTTON_PRESSED
};

struct Button {
    void onTick(int event) { /* publish EV_BUTTON_PRESSED */ }
};

struct Menu {
    void onButtonPressed(int event) { /* publish EV_SOMETHING_ELSE */ }
};

Button button1;
Button button2;
Menu mainMenu;

std::pair<int, std::function<void(int)>> dispatchTable[] = {
    {EV_TIMER_TICK, std::bind(&Button::onTick, &button1, std::placeholders::_1) },
    {EV_TIMER_TICK, std::bind(&Button::onTick, &button2, std::placeholders::_1) },
    {EV_BUTTON_PRESSED, std::bind(&Menu::onButtonPressed, &mainMenu, std::placeholders::_1) }
};

int main(void) 
{
    while(1) {
        int event = EV_TIMER_TICK; // msgQueue.getEventBlocking();
        for (auto& a …
Run Code Online (Sandbox Code Playgroud)

c++ pointers type-erasure c++11

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

Windows上的写时复制文件映射

我有3个通过命名管道进行通信的进程:服务器,写入器,读取器。其基本思路是,作家可以存储大量(〜GB)的二进制块上的服务器,以及读卡器(S)可以找回。但是使用内存映射代替在命名管道上发送数据。

服务器与创建一个未命名的文件支持的映射CreateFileMappingPAGE_READWRITE保护,然后复制该句柄到作家。后作家已完成其工作,把手被复制到任何数量的感兴趣的读者

作家手柄与映射MapViewOfFileFILE_MAP_WRITE模式。

阅读器手柄的地图,MapViewOfFileFILE_MAP_READ|FILE_MAP_COPY模式。

阅读器上,我需要写时复制语义,因此,只要只读取映射,它就在所有阅读器实例之间共享。但是,如果读者想在其中写入内容(例如,就地解析或图像处理),则应将影响限制在修改过程中,并尽可能减少复制页面的数量。

问题
读者尝试写入映射时,它死于分段错误,好像FILE_MAP_COPY没有考虑到那样。上述方法有什么问题?根据MSDN,这应该有效...

我们在Linux上也实现了相同的机制(通过mmapfd传入AF_UNIX辅助缓冲区),并且它按预期工作。

c++ winapi shared-memory

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