c ++基于配置定义类型/调用函数

时间:2010-02-05 03:11:41

标签: c++

在C ++中,是否有一种很好的技术或设计模式可以根据配置执行以下任务?

场景#1:通话功能
如果配置显示:

A:foo()

然后代码应该调用A :: foo(),假设A的对象已经可以访问。

场景#2:声明类型

如果配置显示:

bar:vector<std::string>

然后代码应该在运行时创建一个类型为vector<std::string>的对象。

不希望使用字符串匹配解决方案。

提前致谢。

2 个答案:

答案 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 ++没有运行时反射功能,这正是您的解决方案所需要的。

除非你想做一些不可移植的事情(读取调试符号以找到你的符号,如果你的构建没有调试符号,那么即使这样也行不通),你需要做一些“字符串匹配”解决方案,这将限制您只能支持在开发过程中添加到字符串表中的类型。