在C ++中,是否有一种很好的技术或设计模式可以根据配置执行以下任务?
场景#1:通话功能
如果配置显示:
A:foo()
然后代码应该调用A :: foo(),假设A的对象已经可以访问。
场景#2:声明类型
如果配置显示:
bar:vector<std::string>
然后代码应该在运行时创建一个类型为vector<std::string>
的对象。
不希望使用字符串匹配解决方案。
提前致谢。
答案 0 :(得分:1)
你可以做到这一点,但它需要大量的准备和先验知识。基本上你需要创建所有类方法的函数指针,这些方法必须具有相同的签名,并且你需要在哈希表中保存所有这些信息。像这样:
class Foo {
public:
void MyMethod1(int _input);
void MyMethod2(int _input);
.
.
.
void MyMethodN(int _input);
};
typedef (Foo::*foo_func)(int);
class Acceptor{
public:
void Command(Foo &_foo, string _name, int _arg){
return _foo.*(m_MappedFunctions[ _name ])(_arg);
}
private:
unordered_map<String,foo_func> m_MappedFunctions;
};
您在散列表中放置了所有Foo
方法的函数指针。你看?它既不灵活又需要在代码,配置文件和调用约定之间进行大量协调。
答案 1 :(得分:0)
没有可移植的方式来做这样的事情。 C ++没有运行时反射功能,这正是您的解决方案所需要的。
除非你想做一些不可移植的事情(读取调试符号以找到你的符号,如果你的构建没有调试符号,那么即使这样也行不通),你需要做一些“字符串匹配”解决方案,这将限制您只能支持在开发过程中添加到字符串表中的类型。