在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这样的东西!
我有一个OpenCV应用程序来自办公室内部的网络摄像头流(很多细节),我必须找到一个人工标记.标记是在白色背景的一个黑角规.我使用Canny来查找边缘和cvFindContours进行轮廓加工,然后使用aboutPolyDP和co.用于过滤和查找候选者,然后使用局部直方图进一步过滤,bla bla bla ...
这或多或少有效,但不完全是我想要的.FindContours总是返回一个闭环,即使Canny创建一个非闭合线.我得到一个轮廓走在线的两侧形成一个环.对于坎尼图像(我的标记)上封闭的边缘,我得到2个轮廓,一个在里面,和其他在外面.我不得不对这个操作有问题:
我为每个标记得到2个轮廓(不是那么严重)
最简单的过滤是不可用的(拒绝非闭合轮廓)
所以我的问题是:是否可以为非封闭的Canny边缘获得非闭合轮廓? 或者解决上述两个问题的标准方法是什么?
Canny是一个非常好的工具,但我需要一种方法将2D黑白图像转换为易于处理的东西.类似连接组件的东西,列出组件的步行顺序中的所有像素.所以我可以过滤循环,并将其提供给approxPolyDP.
更新:我错过了一些重要的细节:标记可以处于任何方向(它不是面向摄像机的正面,没有直角),实际上我正在做的是3D方向估计,基于标记的2D投影.
有两个软件团队为同一个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呢?
一些情节曲折使我更加困惑:
我想了解在这种情况下究竟发生了什么,如果它有风险,并且无效问题.让团队处于相同的开发环境不是一种选择.从API中删除std :: classes也很难.
欢迎任何指示!:)
我有一个在内部保存 Closeable 资源的 java 类。这意味着我的类还实现了 Closeable 接口并在其自己的 close() 方法中关闭了内部资源。
我的类在关闭后的预期行为是什么,通常是 Java 中的任何关闭对象?我看到该对象处于失效状态,其内部结构已关闭,但客户仍对其有引用。IMO 访问它是一个编程错误,但错误会不时发生,因此即使在这种情况下,行为也应该是合理的......
我是不是该?
什么是规范的 Java 方式?
我正在基于发布/订阅模式在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) 我有3个通过命名管道进行通信的进程:服务器,写入器,读取器。其基本思路是,作家可以存储大量(〜GB)的二进制块上的服务器,以及读卡器(S)可以找回。但是使用内存映射代替在命名管道上发送数据。
该服务器与创建一个未命名的文件支持的映射CreateFileMapping
与PAGE_READWRITE
保护,然后复制该句柄到作家。后作家已完成其工作,把手被复制到任何数量的感兴趣的读者。
该作家手柄与映射MapViewOfFile
在FILE_MAP_WRITE
模式。
该阅读器手柄的地图,MapViewOfFile
在FILE_MAP_READ|FILE_MAP_COPY
模式。
在阅读器上,我需要写时复制语义,因此,只要只读取映射,它就在所有阅读器实例之间共享。但是,如果读者想在其中写入内容(例如,就地解析或图像处理),则应将影响限制在修改过程中,并尽可能减少复制页面的数量。
问题
当读者尝试写入映射时,它死于分段错误,好像FILE_MAP_COPY
没有考虑到那样。上述方法有什么问题?根据MSDN,这应该有效...
我们在Linux上也实现了相同的机制(通过mmap
fd传入AF_UNIX辅助缓冲区),并且它按预期工作。