1

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

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++ 字符串 switch 语句。

编辑

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

4

1 回答 1

1

恕我直言,使用Boost.Signals2是一种更清晰的方法。还有Boost.Signals库,但从Boost 1.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;
}
于 2013-07-03T18:05:00.283 回答