我有一段代碼,其中有多次相同型別的操作:
void fn() {
if (params[0].count("VARIABLE_1"))
{
STRUCT.VARIABLE_1= boost::lexical_cast<VARIABLE_1_TYPE>(params[0].at("VARIABLE_1"));
}
if (params[0].count("VARIABLE_2"))
{
STRUCT.VARIABLE_2 = boost::lexical_cast<VARIABLE_2_TYPE>(params[0].at("VARIABLE_2"));
}
// many times this kind of if (...) with different parameters
}
可以肯定的是,在現代 C (11, 17, 20) 中使用我假設的模板來撰寫它有一種更優雅的方式。任何想法?
編輯:只有VARIABLE_n和VARIABLE_n_TYPE變化,params[0]保持原樣。
uj5u.com熱心網友回復:
因為你想要一些東西既作為代碼中的識別符號,又作為字串文字,你要么重復自己
template<typename T, typename Map>
void extract_param(T & t, const Map & map, std::string name) {
if (auto it = params.find(name); it != params.end()) {
t = boost::lexical_cast<T>(*it);
}
}
void fn() {
extract_param(STRUCT.VARIABLE, params[0], "VARIABLE");
// ...
}
或使用宏
#define EXTRACT_PARAM(Key) if (auto it = params[0].find(#Key); it != params[0].end()) { \
STRUCT.Key = boost::lexical_cast<decltype(STRUCT.Key)>(*it); \
}
void fn() {
EXTRACT_PARAM(VARIABLE)
// ...
}
#UNDEF EXTRACT_PARAM
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/433977.html
上一篇:使用lldb除錯時重寫模板名稱
