草庐IT

c++ - 如何将 std::function 对象传递给采用函数指针的函数?

我正在尝试与使用这种熟悉模式的c编写的库进行交互:voidsome_c_handler(void(*func)(void*),void*data);现在,我想为这个函数编写一个C++包装器,如下所示:voidmy_new_cpp_handler(std::function&&func){void(*p)()=foo(func);void*data=bar(func);some_c_handler(p,data);}some_c_handler和my_new_cpp_handler都在解决同样的问题;他们正在接受某种功能和某种状态。但后者更受欢迎,因为它从用户那里抽象出很多实现细节,并允

c++ - 将左值传递给右值

我做了一个小的“阻塞队列”类。令我恼火的是,我为传递到enqueue成员函数的值创建了冗余代码。这两个函数做同样的事情(除了右值使用std::move将右值移动到实际的队列集合中),除了分别处理左值和右值:voidenqueue(constT&item){std::unique_locklock(m);this->push(item);this->data_available=true;cv.notify_one();}voidenqueue(T&&item){std::unique_locklock(m);this->push(std::move(item));this->data_

c++ - 将 R 值传递给采用 L 值的函数时的重载歧义

我有2个重载函数-一个采用L值,另一个采用R值。目的是使该函数可以像这样调用:Objobj;foo(obj);或者:foo(Obj());因此,我编写了2个重载函数:templatevoidfoo(T&v){/*...functionbodycodegoeshere...*/}templatevoidfoo(T&&v){foo(v);}intmain(){foo(int(5));}右值重载只需要委托(delegate)给左值重载。按照我的理解,一旦进入函数体,对v的任何使用都会给我一个左值引用,除非我专门使用std::move或std::forward。所以在R值重载中调用foo(v)

c++ - 如何将数据传递给正在运行的线程

当使用pthread时,我可以在线程创建时传递数据。将新数据传递到已经运行的线程的正确方法是什么?我正在考虑制作一个全局变量并让我的线程从中读取。谢谢 最佳答案 那肯定行得通。基本上,线程只是共享相同内存空间的轻量级进程。位于该内存空间中的全局变量可供每个线程使用。诀窍不在于读者,而在于作者。如果你有一个简单的全局内存块,比如int,那么分配给那个int可能是安全的。Bt考虑一些更复杂的东西,比如struct。为了明确起见,假设我们有structS{inta;floatb;}s1,s2;现在s1,s2是structS类型的变量。我们

c++ - 将匿名函数对象传递给 std::function?

这是我的问题:我定义了一个仿函数:classA{public:intoperator()(inta,intb)const{returna+b;}};typedeffunctionFun;然后我使用一个匿名仿函数来创建一个std::function对象,我发现了一些奇怪的东西。这是我的代码:Funf(A());f(3,4);不幸的是,这是错误的。错误信息是:error:invalidconversionfrom‘int’to‘A(*)()’[-fpermissive]error:toomanyargumentstofunction‘Funf(A(*)())’但是,当我如下更改代码时:Aa

c++ - 按值将子类对象传递给采用父类(super class)对象的函数是否是明确定义的行为?

here等相关问题我都看过了和here关于这个话题,他们都描述了对象切片,但没有一个解决它是否安全、可靠和可预测。是否有来自标准或编译器的保证,如果我按值将子类对象传递给需要父类(superclass)的方法,则被切掉的部分恰好是子类,我将能够使用切片的父类(superclass)对象而不用担心未定义的行为? 最佳答案 是的,它是安全、可靠和可预测的,因为它由标准定义良好(它只会从派生类对象复制构造一个基类对象)。但不,它不安全,不应依赖它,并且通常被视为不可预测的,因为您的读者不知道发生了什么。当其他人稍后尝试修改您的代码(包括您

c++ - 通过引用将函数对象传递给标准算法

通过转发引用而不是通过值将函数对象传递到STL算法中不是更好吗?它将允许使用operator()的引用限定符传递的函数对象。有几个关于std::for_each的问题SO上的算法(1,2),它们正在考虑改变传递给std::for_each的函数对象的可观察状态的问题.通过左值引用传递函数对象会解决这个问题,即使对于那些不能返回函数对象的算法来说也是一个副作用(因为它们应该返回,比如说,输出迭代器的最后一个值或其他东西)。例如算法std::for_each可以更改自(从libc++复制):template_Functionfor_each(_InputIterator__first,_I

c++ - 将对象传递给 C/C++ 时如何禁止 R 垃圾回收?

在将对象传递给C++时遇到R的垃圾回收问题。我们有以下场景:我们在R中创建一个匿名函数,并将其传递给C++代码(通过.Call())C++代码存储R函数对象供以后使用(作为SEXP类型)并返回稍后,一些其他C++代码使用R_tryEval()调用所述R函数对象在第2步和第3步之间,R函数对象似乎被R垃圾回收。这会导致崩溃,因为R_tryEval()试图执行不再代表有效R函数的内容目的。这很公平,因为我们没有做任何事情来告诉R函数对象仍在使用中......考虑到这一点:有没有办法从C++代码中将R函数对象标记为正在使用(这样它就不会被gc'd)?或者是否有安全的方法在C++代码中复制R函

node.js - Nodejs Redis 和 Waterfall 没有将值传递给下一个函数

我一直在尝试遵循如下所示的异步waterfall示例;async.waterfall([function(callback){callback(null,'one','two');},function(arg1,arg2,callback){//arg1nowequals'one'andarg2nowequals'two'callback(null,'three');},function(arg1,callback){//arg1nowequals'three'callback(null,'done');}],function(err,result){//resultnowequals

node.js - Node redis将数据传递给回调

我正在使用redisnpm模块,我想将一些数据(例如for循环的索引)传递给回调,以便我可以将本地数据(函数调用时的值)映射到响应数据。如:redisClient.get('a',[data1,data2],function(err,res,data1,data2){/*morecode*/})我已经查看了文档,但找不到任何提及该内容的内容。 最佳答案 functionredisGet(_data1,_data2,callback){redisClient.get('a',function(err,res){callback(err