如何将boost::bind对象存储为成员变量
How to store boost::bind object as member variable?
我使用boost::bind动态创建组合函数,并希望将对象存储为某个类成员变量以供以后使用。例如,我们有两个函子:
struct add{double operator()(double x, double y) const{return x+y;};};
struct multiply{double operator()(double x, double y) const{return x*y;};};
然后创建一个函数f(x,y,z) = (x+y)*z,我可以这样做:
auto f = boost::bind<double>(multiply(), boost::bind<double>(add(), _1, _2), _3);
调用f(x,y,z)效果很好。现在我想将f保存为类成员变量,如下所示:
struct F
{
auto func;
double operator(const std::vector<double>& args) const
{
return func(args[0],args[1],args[2]); //Skipping boundary check
}
}
F f_obj;
f_obj.func = f;
f_obj(args);
当然,我不能声明一个自动变量。有什么办法可以绕过这个吗?
注意,我没有使用boost::函数,因为它会极大地影响性能,这对我来说很重要。
谢谢你的建议
两种选择:使用boost::function
,并测量它是否实际影响性能。
或者将F设为以func
的类型为参数的模板,由bind
表达式的类型推导出F。
编辑:第二个选项的问题是它没有摆脱尴尬的类型。你可以用模板覆盖的纯虚函数定义一个基类。但是,您需要管理动态内存并支付虚拟函数的成本-因此,您不妨回到boost::function
(或std::function
),它为您做了大致相同的事情。
从bind()
返回的类型是特定于函数对象和参数的每种组合的。如果要存储结果,则需要以某种方式擦除类型。最明显的方法是使用function<..>
.
当结果函数对象被频繁调用时,function<...>
有效地执行虚拟分派所带来的开销可能太高。解决这个问题的一种方法是将函数对象与合适的批量操作捆绑在一起,而不是存储函数对象来存储合适的应用程序。当需要单个呼叫时,这将不起作用,但是当需要大量呼叫时,虚拟调度只需支付一次。
相关文章:
- 访问存储在向量C++中的结构的多态成员
- 如何创建存储指向成员函数的指针的类 (C++)
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- 使用成员函数和存储值定义书籍类
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- 通过放置 new 重用数据成员存储
- 如何将提升正常分发存储为类成员
- C++:将未知类型的对象存储为成员变量的类
- structtm是否将时区信息存储为其数据成员
- 是否值得使用位移在单个字节中存储多个小数据成员?
- 将列表迭代器存储为成员
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 流的奇怪问题.不能存储具有特定值的成员变量的对象
- 不从成员函数C 存储返回值认为不良习惯
- 在数据结构中存储成员函数
- 如何通过接口存储成员函数指针
- 存储成员指针与成员值
- 存储成员函数的位置
- GCC如何在内存中存储成员函数