2013-07-03 61 views
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的類型的一種方法:地圖<>而無需在所述第一聲明一個映射上一行?我想我的意思是審美 - 代碼應該看起來整潔的權利?

當輸入是'交易類型'字符串時,是否有一種更簡單/更簡潔的方法來完成此C++字符串切換語句。

編輯

爲了進一步澄清。我可以手動寫出boost:bind類型的類型,但似乎過多。這可能是一個非常好的例子,可以使用auto和decltype來簡化代碼。 但是,必須以一種方式在地圖中聲明一個條目,而以另一種方式聲明其他條目只是看起來錯誤;所以這就是我想要解決的問題

+0

也許你可以使用升壓信號? – bennofs

回答

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

現在乾淨。我將瀏覽Signals2,因爲我不知道這些 – Ronnie