带有boost::bind和map的方法指针
Method pointer with boost::bind and map
有更好的方法来实现吗
auto commodityOneLeg = boost::bind(&VegaFactory::load_commodity_one_leg,this,conn,_1);
std::map<std::string,decltype(commodityOneLeg)> methods;
methods.insert(std::make_pair("COMMODITYONELEG",commodityOneLeg));
methods.insert(std::make_pair("FXOPTION",boost::bind(&VegaFactory::load_fx_index,this,conn,_1)));
methods.insert(std::make_pair("FXBARROPT",boost::bind(&VegaFactory::load_fx_bar_opt,this,conn,_1)));
methods.insert(std::make_pair("COMMODITYINDEX",boost::bind(&VegaFactory::load_fx_index,this,conn,_1)));
auto f = methods.find(trade_table);
if(f != methods.end()) {
fx_opt = (f->second)(t_id);
}
有没有一种方法可以声明std:map<>的类型而不必首先在前一行声明映射?我想我的意思是从美学上来说——代码应该看起来很整洁,对吧?
当输入是"交易类型"字符串时,有没有一种更干净/更简单的方法来完成这个c++字符串切换语句。
编辑
进一步澄清。我可以手动写出boost:bind类型,但这似乎太过分了。这可能是一个很好的例子,说明auto和decltype可以用来简化代码。然而,必须以一种方式声明地图中的一个条目,而以不同的方式声明其他条目,这看起来是错误的;所以这就是我想要解决的
IMHO使用Boost.Signals2是一种更明确的方式。还有Boost.Signals库,但它从Boost1.54开始就被弃用了。下面的代码演示了它。我认为使用Boost.Function库也可以实现类似的功能。
#include <boost/signals2.hpp>
#include <map>
#include <string>
typedef boost::signals2::signal<bool (int)> CSignal;
typedef CSignal::slot_type CSignalSlotType;
typedef std::map<std::string, CSignalSlotType> CMethodMap;
bool Func1(int a, int b) {
return a == b;
}
bool Func2(int a, int b) {
return a < b;
}
int main(int, char *[]) {
CMethodMap methods;
methods.insert(std::make_pair("Func1", boost::bind(&Func1, 1, _1)));
methods.insert(std::make_pair("Func2", boost::bind(&Func2, 2, _1)));
auto it = methods.find("Func1");
if(it != methods.end()) {
CSignal signal;
signal.connect(it->second);
auto rt = signal(2);
if (rt) {
const bool result = *rt;
}
}
return 0;
}
这是一个使用Boost.Function的示例代码。它看起来更简单,但我以前使用Signals2库。
#include <map>
#include <string>
#include <boost/function.hpp>
#include <boost/bind.hpp>
typedef boost::function<bool (int)> CFunction;
typedef std::map<std::string, CFunction> CMethodMap;
bool Func1(int a, int b) {
return a == b;
}
bool Func2(int a, int b) {
return a < b;
}
int main(int, char *[]) {
CMethodMap methods;
methods.insert(std::make_pair("Func1", boost::bind(&Func1, 1, _1)));
methods.insert(std::make_pair("Func2", boost::bind(&Func2, 2, _1)));
auto it = methods.find("Func1");
if(it != methods.end()) {
auto &f = it->second;
const bool result = f(2);
}
return 0;
}
相关文章:
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 返回 std::map with get 方法
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 方法中填充的shared_ptr到map在调用者中返回为空
- 从std::map值中获取密钥的有效方法
- 为什么 memcpy() 是一种将元素添加到 'std::map' 的方法?
- std::map 索引运算符与插入方法的性能
- 当对象为值时访问实例方法<map>
- 最有效的安全方法将 std::map<int, std::shared_ptr> 转换为 std::<Base>map<int, std::shared_ptr<D
- 在std :: Map或std :: set中找到具有给定前缀的键的优雅方法
- STD :: MAP-使用下标操作员与插入方法添加元素
- 使用类方法插入STD :: MAP
- boost-python 当C++方法返回 std::map<string,X*>
- 有没有一种直接、快速的方法可以将列表"map"到<VectorXd> MatrixXd?
- 访问std::map中元素的最有效方法是什么
- 添加和初始化新std::map元素的最有效方法是什么
- 如何使用 Ruby 的 Enumerable .map 方法在 C++ 中执行类似于 map 的操作
- "resurrect"(序列化/和反序列化)标准的最快方法::map
- 迭代 std::map 的更好方法