使用模板化函数映射枚举值

时间:2012-09-18 11:22:58

标签: c++

假设我有10个模板化函数,例如:

command1<T>(const std::string&) 
command10<T>(const std::string&, int timeInSeconds)

在我的代码中的某个时间点,我将建立我希望执行特定命令。然后,我将请求有关与此命令相关联的类型的信息(在运行时),该命令通过枚举返回给我。所以我确定我希望执行command2并且枚举包含STRING。我谨因此致电:

command2<std::string>(id, param1, param2); 

您建议采用哪种方法进行此映射?

枚举可以包含INT,BOOL; DOUBLE或STRING。传递给特定命令的参数不依赖于枚举值。

示例:

以下是一个更好解释的例子:

假设我的程序从命令行收到“command4 a”。我解析这个输入并确定我需要调用command4。然后我查找与“a”相关联的类型,在这种情况下获取INT。我现在需要致电command4<int>("a");

1 个答案:

答案 0 :(得分:2)

switch语句可在此处使用:

switch (type) {
    case INT: commmand4<int>(id); break;
    ...
}

根据您实际调用方法的方式,对参数进行模板化可能是一个好主意:

template<typename F, typename... Args> void call_function(Type type, Args... &&args) {
    switch (type) {
        case INT: return F::command<int>(std::forward(args)...);
        ...
    }
}

请注意,因为您无法将函数模板传递给函数,所以您必须将函数模板包装在类中:

struct Command1 {
    template<typename T> static void command(const std::string&);
};
...

call_function<Command1>(INT, "a");