打包对象、调用的方法和参数,将其调用到单个对象中,以便稍后调用它 是否有可能用C++ 11或Boost创建一个对象,该对象存储对象指针(实例)、方法指针和一些参数,并可以在以后使用这些参数调用该方法?我的意思是-如何只使用std或Boost模板?我很确定这是可能的,但不知道最好的办法是什么
这里有一个真正的问题:是否有可能在同一个容器中存储引用不同方法(具有不同签名)的多个这样的对象?请查看C++11提供的。这正是你想要的。你甚至不需要用助推器。例如:打包对象、调用的方法和参数,将其调用到单个对象中,以便稍后调用它 是否有可能用C++ 11或Boost创建一个对象,该对象存储对象指针(实例)、方法指针和一些参数,并可以在以后使用这些参数调用该方法?我的意思是-如何只使用std或Boost模板?我很确定这是可能的,但不知道最好的办法是什么,c++,boost,C++,Boost,这里有一个真正的问题:是否有可能在同一个容器中存储引用不同方法(具有不同签名)的多个这样的对象?请查看C++11提供的。这正是你想要的。你甚至不需要用助推器。例如: class C { public: void Foo(int i); } C c; // Create a function object to represent c.Foo(5) std::function<void(void)> callLater=std::bind(&C::Foo,std::re
class C
{
public:
void Foo(int i);
}
C c;
// Create a function object to represent c.Foo(5)
std::function<void(void)> callLater=std::bind(&C::Foo,std::ref(c),5);
// Then later when you want to call c.Foo(5), you do:
callLater();
C类
{
公众:
void Foo(inti);
}
C C;
//创建一个函数对象来表示c.Foo(5)
std::function callLater=std::bind(&C::Foo,std::ref(C),5);
//之后,当您想调用c.Foo(5)时,您可以执行以下操作:
callLater();
检查C++11提供的功能。这正是你想要的。你甚至不需要用助推器。例如:
class C
{
public:
void Foo(int i);
}
C c;
// Create a function object to represent c.Foo(5)
std::function<void(void)> callLater=std::bind(&C::Foo,std::ref(c),5);
// Then later when you want to call c.Foo(5), you do:
callLater();
C类
{
公众:
void Foo(inti);
}
C C;
//创建一个函数对象来表示c.Foo(5)
std::function callLater=std::bind(&C::Foo,std::ref(C),5);
//之后,当您想调用c.Foo(5)时,您可以执行以下操作:
callLater();
这是std::bind
和std::function
的经典用例:
#include <functional>
#include <vector>
using namespace std::placeholders; // for _1, _2, ...
std::vector<std::function<int(double, char)>> v;
Foo x;
Bar y;
v.emplace_back(std::bind(&Foo::f, &x, _1, _2)); // int Foo::f(double, char)
v.emplace_back(std::bind(&Bar::g, &y, _2, true, _1)); // int Bar::g(char, bool, double)
v.emplace_bacK(some_free_function); // int some_free_function(double, char)
这是
std::bind
和std::function
的经典用例:
#include <functional>
#include <vector>
using namespace std::placeholders; // for _1, _2, ...
std::vector<std::function<int(double, char)>> v;
Foo x;
Bar y;
v.emplace_back(std::bind(&Foo::f, &x, _1, _2)); // int Foo::f(double, char)
v.emplace_back(std::bind(&Bar::g, &y, _2, true, _1)); // int Bar::g(char, bool, double)
v.emplace_bacK(some_free_function); // int some_free_function(double, char)
但是我可以在同一个容器中存储不同的函数对象吗?@VioletGiraffe生成的对象可以很容易地存储在一个容器中。如果函数对象都具有相同的签名,则可以为它们创建一个容器,例如,
std::vector
。。。但如果它们不这样做,就不会。您无法在同一容器中轻松存储不同类型的函数对象。此外,除了测试函数对象是否都为空外,您无法相互比较函数对象。啊,是的,OP绑定了所有参数,因此这里的关键是,真正需要的是表达式callLater()
(同构存储的必然结果)+1但是我可以在同一个容器中存储不同的函数对象吗?@VioletGiraffe生成的对象可以很容易地存储在一个容器中。如果函数对象都具有相同的签名,则可以为它们创建一个容器,例如,std::vector
。。。但如果它们不这样做,就不会。您无法在同一容器中轻松存储不同类型的函数对象。此外,除了测试函数对象是否都为空外,您无法相互比较函数对象。啊,是的,OP绑定了所有参数,因此这里的关键是,真正需要的是表达式callLater()
(同构存储的必然结果)+1代码>有可能用C++ 11或Boost创建一个对象,…代码>是std::bind
,boost::bind
是否可以以任何方式将引用不同方法(具有不同签名)的多个这样的对象存储在同一个容器中
不,不是真的。为什么要这样做?@LightnessRacesinOrbit:在我的特定情况下,它将允许非常方便的线程间调用机制。在工作线程中创建调用,在UI线程中调用,它不必关心签名。哦,如果你预先绑定了所有参数,那就好了。因为结果函子将有零个参数和一个void返回类型;被调用的实际函数是否有参数并不重要,因为您已经绑定了它们。是的,这是一种常见的方法。@LightnessRacesinOrbit:太好了,这就是我错过的部分!谢谢。<代码>,有可能用C++ 11或Boost创建一个对象…代码>是std::bind
,boost::bind
是否可以以任何方式将引用不同方法(具有不同签名)的多个这样的对象存储在同一个容器中
不,不是真的。为什么要这样做?@LightnessRacesinOrbit:在我的特定情况下,它将允许非常方便的线程间调用机制。在工作线程中创建调用,在UI线程中调用,它不必关心签名。哦,如果你预先绑定了所有参数,那就好了。因为结果函子将有零个参数和一个void返回类型;被调用的实际函数是否有参数并不重要,因为您已经绑定了它们。是的,这是一种常见的方法。@LightnessRacesinOrbit:太好了,这就是我错过的部分!谢谢。您的Foo::f
示例有点不正确(参数数量错误)。@LightnessRacesinOrbit:Ugh,我一直希望这样做能起作用:-您的意思是未给出占位符时自动绑定占位符?@LightnessRacesinOrbit:Yes。这感觉像是一件应该很有效的事情。。。它可能与boost::bind
一起工作吗?我总觉得我在什么地方见过。不,据我所知不是。(据我记忆所及,根据我的经验也是如此。)你的Foo::f
示例有点不完整(参数数量错误)。@LightnessRacesinOrbit:Ugh,我一直希望这能起作用:-你是说占位符在未给出时会自动绑定?@LightnessRacesinOrbit:Yes。这感觉像是一件应该很有效的事情。。。它可能与boost::bind
一起工作吗?我总觉得我在什么地方见过。不,据我所知不是。(据我记忆所及,以我的经验也不例外。)