Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打包对象、调用的方法和参数,将其调用到单个对象中,以便稍后调用它 是否有可能用C++ 11或Boost创建一个对象,该对象存储对象指针(实例)、方法指针和一些参数,并可以在以后使用这些参数调用该方法?我的意思是-如何只使用std或Boost模板?我很确定这是可能的,但不知道最好的办法是什么_C++_Boost - Fatal编程技术网

打包对象、调用的方法和参数,将其调用到单个对象中,以便稍后调用它 是否有可能用C++ 11或Boost创建一个对象,该对象存储对象指针(实例)、方法指针和一些参数,并可以在以后使用这些参数调用该方法?我的意思是-如何只使用std或Boost模板?我很确定这是可能的,但不知道最好的办法是什么

打包对象、调用的方法和参数,将其调用到单个对象中,以便稍后调用它 是否有可能用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

这里有一个真正的问题:是否有可能在同一个容器中存储引用不同方法(具有不同签名)的多个这样的对象?

请查看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();
检查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
一起工作吗?我总觉得我在什么地方见过。不,据我所知不是。(据我记忆所及,以我的经验也不例外。)