我有一個有兩個字串引數的工廠函式(每個引數表示一個類)。我怎樣才能減少使用if分支?
A create_A(string type,string order){
if (type=="LLT" && order == "AMD"){
return A<LLT, AMD>()。
}
elif(type=="LLT" && order=="colamd"){
return A<LLT, COLAMD>()。
}
elif(type=="LU"&& order=="AMD"){
return A<LU, AMD>()。
}
elif(type=="LU", && order="COLAMD"){
return A<LU, COLAMD>()。
}
UPDATE: 我也試過這樣做。但我還是想減少if分支。
std::unique_ptr<Base> create_A(string type,string order){
if (type=="LLT" && order == "AMD"){
return std::make_unique<Derived<LLT, AMD>>()。
}
else if(type=="LLT" && order=="COLAMD") {
return std::make_unique<Derived<LLT, COLAMD>>()。
}
else if(type=="LU" && order=="AMD") {
return std::make_unique<Derived<LU, AMD>>()。
}
else if(type=="LU", && order="COLAMD") {
return std::make_unique<Derived<LU, COLAMD>>()。
}
}
uj5u.com熱心網友回復:
減少這段代碼的一種方法是使用一個std::(unsorted_)map,以std::pair<std::string,std::string>作為鍵型別,以lambdas或free函式作為值型別。
然而,一個函式不能回傳不同的型別,并且A<w,x>是一個不同于A<y,z>的型別。如果你真的想讓它作業,你應該從一個非模板基類中派生出A,回傳一個指向該基類的指標,然后動態地創建你的A物件,例如:
using key_type = std::pair<std::string, std::string> 。
using func_type = std::unique_ptr<Base>(*)()。
#define MAKE_ENTRY(type, order) {{#type, #order}, [] () -> std:: unique_ptr<Base> { return std::make_unique<Derived<type, order>> (); }
std::unique_ptr<Base> create_A( string type, string order){
static std::unordered_map<key_type, func_type> A_types = {
MAKE_ENTRY(LLT, AMD)。
MAKE_ENTRY(LLT, COLAMD)。
MAKE_ENTRY(LU,AMD)。
MAKE_ENTRY(LU, COLAMD)
}:
auto func = A_types.at(std::make_pair(type, order));
return func()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/316130.html
標籤:
上一篇:C 覆寫模板類中的虛擬函式
