如何使用带有多个字符串参数的工厂方法来创建模板class?

How to use factory method with multi string parameters to create a template class?

我有一个带有两个字符串参数的工厂函数(每个参数表示一个 class)。我怎样才能减少使用 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>();
    }
}

更新:我也试过了。但我还是想减少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>>();
    }
}

减少此代码的一种方法是使用 std::(unsorted_)mapstd::pair<std::string,std::string> 作为键类型,并使用 lambda 或自由函数作为值类型。

但是,函数不能 return 不同的类型,并且 A<w,x> 是不同于 A<y,z> 的类型。如果你真的想让它工作,你应该从非模板基 class 派生 A,return 指向该基 class 的指针,然后创建你的 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();
}