这里是在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