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

时间:2013-07-03 17:03:30

标签: c++ boost bind

有没有更好的方法来做到这一点

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&lt;&gt;无需先在前一行声明映射?我想我的意思是美学 - 代码应该看起来整洁吗?

当输入是'交易类型'字符串时,是否有更简洁的方法来完成此c ++字符串切换语句。

修改

进一步澄清。我可以手动写出boost:bind类型,但这似乎过多了。这可能是auto和decltype可用于简化代码的一个非常好的例子。 然而,必须以一种方式在地图中声明一个条目而以不同方式声明其他条目看起来是错误的;这就是我想要解决的问题

1 个答案:

答案 0 :(得分:1)

使用Boost.Signals2的恕我直言是一种更清晰的方式。还有Boost.Signals库,但从Boost 1.54开始是deprecated。以下代码演示了它。我认为使用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;
}