這裏是在C++中,它使用枚舉值和功能對象之間的映射以得到類型安全,靈活的調度框架的一個示例:
//dummy analysis functions
void smithJonesAnalysis (int data){cout << "Smith";}
void pineappleMangoAnalysis (int data){cout << "Pineapple";}
class Analyzer
{
//different analysis methods
enum class AnalysisMethod {SmithJones, PineappleMango};
//a map from analysis method to a function object
std::map<AnalysisMethod, std::function<void(int)>> m_analysis_map;
AnalysisMethod stringToMethod (std::string method)
{
//some basic string canonicalisation
std::transform(method.begin(), method.end(), method.begin(), ::tolower);
if (method == "smith-jones method")
return AnalysisMethod::SmithJones;
if (method == "pineapple-mango method")
return AnalysisMethod::PineappleMango;
throw std::runtime_error("Invalid analysis method");
}
public:
Analyzer()
{
//register all the different functions here
m_analysis_map[AnalysisMethod::SmithJones] = smithJonesAnalysis;
m_analysis_map[AnalysisMethod::PineappleMango] = pineappleMangoAnalysis;
}
//dispatcher function
void operator() (std::string method, int data)
{
AnalysisMethod am = stringToMethod(method);
m_analysis_map[am](data);
}
};
它用於像這樣:
Analyzer a;
a("Smith-Jones Method", 0);
a("Pineapple-Mango Method", 0);
Demo
與簡單開關語句相比,這具有一大堆優勢:
- 它很容易添加/刪除分析方法
- 這是比較容易的方式來改變該方法接受
- 你可以有不同的
Analyzer
S代表不同的區域,模板化和專業化的數據的類型,以及所有你想需要改變的是註冊方法。
- 您可以啓用/在一個非常明確的時尚
我建議採取看看策略模式在運行時禁用分析方法。 – Xaqq
我確實看到了戰略模式,但不太明白如何將其應用於我的案例。 –
你是否在說'myfunc(5,int)'應該返回類型爲'int'的5,而'myfunc(5,str)'應該返回數據類型爲'str'的''5''? – ZdaR