带有boost::bind和map的方法指针

Method pointer with boost::bind and map

本文关键字:方法 map 指针 boost bind 带有      更新时间:2023-10-16

有更好的方法来实现吗

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;
}