如何将一个非静态类成员`std::bind`到Win32回调函数`WNDPROC`上?
我正在尝试将非静态类成员绑定到标准 WNDPROC 功能.我知道我可以简单地通过使班级成员静态来做到这一点.但是,作为C ++ 11 STL学习者,我对使用标题下的工具非常感兴趣. 我的代码如下. class MainWindow { public: void Create() { WNDCLASSEXW WindowClass; WindowClass.cbSize = sizeof(WNDCLASSEX); WindowClass.style = m_ClassStyles; WindowClass.lpfnWndProc = std::function
22 2023-12-04
编程技术问答社区
如何在没有特定模板的情况下存储std::bind的向量?
在走上问题上,我想知道是否可以持有vector>由std::bind创建的功能,因此我可以避免使用std::function及其重量级包装. #include #include #include #include int add(int a, int b) {return a + b;} int main() { //I believe this here is just a special type of bound function. auto add2 = std::bind(add, std::placeholders::_1, 2); auto add3 = std::bind(add, std::placeholders::_1, 3); //Yup. std::cout
8 2023-11-17
编程技术问答社区
将一个带有任意参数和占位符的函数存储在一个类中,以后再调用它
所以我正在创建一种事件处理程序,如果可以的话,我正在编写"事件听众包装器"的过程. 基本思想是: 当您想订阅事件时,您会创建一个函数,该函数应在事件发射时调用. 您将此侦听器功能放入包装器中,以将功能传递到调度程序上. 调度程序获得了一个事件,为您的侦听器找到包装器,并用事件设置的参数值调用基础函数. ,只要听众都只接受我的EventBase课程的一个参数,我就已经有所工作.然后,我必须将其输入到通过的正确事件中. 我想要的是让我的侦听器函数具有"任何"类型的参数,并以一种让我根据事件触发的任何参数称呼它的方式来存储该功能.每个侦听器功能只会收到一种类型的事件,或者它是自我的事件.这将使我不必在每个侦听器中键入每个事件,而是将通过正确的事件. 我找到了这个包装器的一些代码,几乎是完美的,有一些我似乎无法解决的小问题.我将在下面解释. 代码@hmjd: #include #include #include
10 2023-11-14
编程技术问答社区
如何避免与std::bind()临时对象的显式投射?
std :: bind的返回类型是(故意)未指定的.它在std :: function. 中是存储 下面的示例程序显示了我必须如何将std :: bind()返回到std ::函数的临时对象,以调用fn1(). 如果可以知道std :: bind的返回类型,那么我可以超载回调构造函数,并且不再需要明确施放std :: bind临时对象. 有什么方法可以避免明确的铸造? // g++ -std=c++11 test.cxx #include using std::placeholders::_1; class A { public: void funcA (int x) { } }; class Callback { public: Callback () = default; Callback (std::function f) { }
6 2023-09-30
编程技术问答社区
std::bind如何与成员函数一起工作
我正在使用std::bind,但是当我们将其与成员类功能一起使用时,我仍然不明白它的工作原理. 如果我们具有以下功能: double my_divide (double x, double y) {return x/y;} 我非常了解下一行代码: auto fn_half = std::bind (my_divide,_1,2); // returns x/2 std::cout
8 2023-09-29
编程技术问答社区
如何std::bind一个智能指针的返回方法?
所以我在Bar类中有这种方法: std::shared_ptr Bar::getStuff() const { //... } 我有回调类型: typedef std::function Callback; void Foo::registerCallback(const Callback& callback) { //... } 现在我想在此方法上使用std::bind,例如: Foo foo; Bar bar; //I create an instance of an Bar, called bar. foo.registerCallback(std::bind(&Bar::getStuff, std::ref(bar))); //
6 2023-09-05
编程技术问答社区
C++11的随机数和std::bind以意想不到的方式互动
我正在使用GCC 4.6.3,并试图使用以下代码生成随机数: #include #include int main() { std::mt19937 rng_engine; printf("With bind\n"); for(int i = 0; i dist(0.0, 1.0); auto rng = std::bind(dist, rng_engine); printf("%g\n", rng()); } printf("Without bind\n"); for(int i = 0; i dist(0.0, 1.0
6 2023-07-24
编程技术问答社区
如何使用bind将一个成员函数作为函数指针传递?
我正在尝试将成员函数作为功能指针传递,因此我不需要依靠单例或全局功能来处理QT 5中的QT消息.在正确的类型中,它具有正确的签名,并且绑定应允许我在隐式this指针中堵塞,从本质上讲,将成员函数作为全局/未拥有的函数传递. void ProgramMessageHandler::setAsMessageHandlerForProgram() { std::function funcPtr; funcPtr = std::bind(handleMessages, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); qInstallMessageHandler(funkPtr); } 这不会编译.我可以成功地创建我的funcPtr变量
50 2023-07-16
编程技术问答社区
std::bind()-从派生类的成员函数中获取一个基本的保护成员函数。
我想从派生类中bind()到我的基类函数的版本.该函数在基础中受到保护.当我这样做时,代码在clang中愉快地编译(Apple LLVM编译器4.1),但在G ++ 4.7.2和Visual Studio 2010中都会出现错误.错误符合以下路线:"'BASE :: FOO':无法访问受保护的成员." 的意义是,参考的上下文实际上在bind()之内,当然,该函数被视为受保护.但是bind()不应该继承调用函数的上下文 - 在这种情况下,Derived::foo() - 因此,将基本方法视为可访问的? 以下程序说明了问题. struct Base { protected: virtual void foo() {} }; struct Derived : public Base { protected: virtual void foo() override { Base::foo(); //
18 2023-06-17
编程技术问答社区
带有std::函数参数的不同重载与bind(有时)是模糊的。
我有两个函数foo的过载,它们在不同的std::function中,当与std::bind的结果一起使用时,它会导致后者的歧义问题.我不明白为什么只有这是模棱两可的. void foo(std::function) {} void foo(std::function) {} void take_int(int) { } int ret_int() { return 0; } 在使用int() bind函数时,我会得到歧义错误 foo(std::bind(ret_int)); // ERROR 使用GCC-5.1错误(且与Clang相似) error: call to 'foo' is ambiguous foo(std::bind(ret_int)); ^~~ note: candidate function void foo(std::function) {} ^ note: can
20 2023-05-15
编程技术问答社区
使用std::bind的重载函数
我找不到使用std::bind将参数绑定到超载函数的方法.不知何故std::bind无法推断出超载类型(对于其模板参数).如果我不超载功能,一切都可以.下面的代码: #include #include #include using namespace std; using namespace std::placeholders; double f(double x) { return x; } // std::bind works if this overloaded is commented out float f(float x) { return x; } // want to bind to `f(2)`, for the double(double) version int main() { // none of the lines below compile:
56 2023-05-15
编程技术问答社区
"对......未解决的重载函数类型的调用没有匹配的函数"
我正在尝试创建一个库,用户可以在其中修改实例级别的函数的行为,并设法访问此实例的成员.这篇文章是此线程这是 this One . praetorian 建议我使用STD ::函数/绑定, .不幸的是,我有两个错误: pb#1:错误:呼叫'child1 :: bindit()' 没有匹配功能 pb#2:错误:'operand ='无匹配(操作数类型为'std :: function'and std :: _ bind_helper)(const double&),child1 ,const std ::::: _ placeholder &> :: type {aka std :: _ bind(child1 ,std :: _占位符))(const double&)>}') 我不明白如何解决这些问题. #include #include #include #include usi
78 2023-03-11
编程技术问答社区
用C++11接口包裹C语言回调的最佳方式是什么?
假设这是要包装的C函数: void foo(int(__stdcall *callback)()); 带有C功能指针回调的两个主要陷阱是: 无法存储绑定表达式 无法存储捕获Lambdas 我想知道包装这样的功能的最佳方法.第一个对于成员函数回调特别有用,而第二个对于使用周围变量的内联定义,但这些定义不是唯一的用途. 这些特定功能指针的另一个属性是他们需要使用__stdcall调用约定.据我所知,这完全消除了Lambdas的一种选择,否则有点令人讨厌.我也想至少也允许__cdecl. 这是我能够提出的最好的事情,而没有开始依靠功能指针没有的支持.通常会在标题中.这是#include //C function in another header I have no control over extern "C" void foo(int(__stdcall *callback)()) { callback(); } namespa
22 2023-03-06
编程技术问答社区
为什么在C++20中使用`std::bind_front`而不是lambdas?
如一个类似措辞的问题(为什么要在c中使用lambdas bind bind bink ++ 14?)答案是 - 没有理由(还提到了为什么使用lambdas会更好). 我的问题是 - 如果在C ++ 14中不再使用绑定的理由,为什么标准委员会发现有必要添加 std::bind_front 在C ++ 20? 中 现在,它比lambda有新的优势吗? 解决方案 bind_front绑定第一个X参数,但是如果可呼叫呼叫更多参数,则将其粘贴到末端.当您仅绑定函数的前几个参数时,这使得bind_front非常可读. 显而易见的示例是为成员函数创建一个绑定到特定实例的可可: type *instance = ...; //lambda auto func = [instance](auto &&... args) -> decltype(auto) {return instance->function(std::forward(args
40 2023-03-02
编程技术问答社区
c++11的绑定和应用?
std::bind有时被描述为"部分应用".当函数的所有参数被绑定时,函数本身都不会应用? 有什么原因. 例如,以下代码什么也没打印. #include #include using namespace std; using namespace std::placeholders; void f(int a,string b) {cout
42 2023-03-02
编程技术问答社区
为什么在这种情况下std::bind需要占位符?
回答这个问题,我偶然看到以下事实. 请参阅此示例: void func1(const char *str1, const char *str2) { puts(str1); puts(str2); } ... auto fn = std::bind(func1, "asdf"); fn("1234"); 它无法编译: prog.cpp: In function ‘int main()’: prog.cpp:11:14: error: no match for call to ‘(std::_Bind) (const char [5])’ fn("1234"); ^ 如果我将代码更改为此,则效果很好: auto fn = std::bind(func1, "asdf", _1); 输出是: asdf 12
10 2023-03-02
编程技术问答社区
std::bind和boost::bind的多态性的区别
我有一个派生的类,从该类中,我从该类中绑定了一个虚拟函数,该虚拟函数我没有在此类中覆盖,因此我希望称呼其中一个父级. 它可以与Boost(1.55)一起使用,但是如果我切换到C ++ 11的STD :: BIND,则拒绝使用 编译 错误C2100:非法间接 1>函数(1152):请参阅函数模板实例化'_rx std :: _ pmf_wrap ::::::::::::::::)被编译 1>与 1> [ 1> _rx = bool, 1> _pmf_t = bool(__ thiscall base ::*)(void), 1> _farg0 =基础, 1> _v0_t = std :: _ nil, 1> _v1_t = std :: _ nil, 1> _v2_t = std :: _ nil, 1> _v3_t = std :: _ nil, 1> _v4_t = std :: _ nil, 1> _v5_t = std :: _ nil, 1> = std :: _ ni
30 2023-03-02
编程技术问答社区
我应该看到std::bind和boost::bind之间的显著差异吗?
我正在探索g ++ -4.7上的C ++ 11的支持(ubuntu/linaro 4.7.3-2-2-2ubuntu〜12.04,具体是),我似乎正在发现差异. . 特别是,如果我发表评论#include 并系统地替换boost::bind的出现boost::bind std::bind在Boost asio async客户端示例中(取自http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/Example/http/client/async_client.cpp ),程序不再编译. 对此的任何解释? 解决方案 #include namespace boost { namespace asio { namespace stdplaceholders { static decltype ( :: std :
64 2023-03-02
编程技术问答社区