【问题标题】:Map Of functions c++函数映射 c++
【发布时间】:2012-06-17 21:44:03
【问题描述】:

我已经制作了一张功能图。所有这些函数都是 void 并且接收单个字符串参数。

代码:

void f1(string params){...}
void f2(string params){...}
void f3(string params){...}

map<string , void*> funcMap;

funcMap["f1"] =(void*)&f1;
funcMap["f2"] =(void*)&f2;
funcMap["f3"] =(void*)&f3;

如何调用函数? 我尝试了下一个代码,但 id 不起作用:

void (*func)(string) =  &funcMap[commandType];
func(commandParam);

我收到此错误消息:

Server.cpp:160:46: error: cannot convert ‘void**’ to ‘void (*)(std::string) {aka void (*)(std::basic_string<char>)}’ in initialization

【问题讨论】:

    标签: c++ function-pointers


    【解决方案1】:
    using pfunc = void (*)(string);
    
    map<string, pfunc> funcMap; 
    funcMap["f1"] = f1; //and so forth
    

    然后调用:

    pfunc f = funcMap[commandType];
    (*f)(commandParam);   
    

    一般来说,为什么要抛弃类型安全?如果是函数指针映射,则声明为一个。

    【讨论】:

    • 为什么不让编译器来承担?
    • 我没听懂。究竟是什么热量?
    • 使用类和关键字 virtual(见下文)。
    • “一般来说,为什么要抛弃类型安全?”他们不仅抛弃了类型安全,而且定义不明确。 C 和 C++ 没有定义在函数指针类型和非函数指针类型之间进行转换时会发生什么。
    【解决方案2】:

    为什么不将它们作为单独的类。

    然后将方法设置为虚拟。

    然后你可以在字符串和基类之间建立一个映射。

    class Someoperation
    {
        virtual void Doit() = 0;
    };
    
    map<string, Someopertion> ops;
    

    然后

    class MyOp : public Someoperation
    {
       void Doit() { /* Some code here */}
    };
    

    只需添加对象

    ops["Hello"] = MyOp();
    

    然后调用它

    ops["Hello"].Doit();
    

    【讨论】:

    • "ops["Hello"] = MyOp();"将出错,因为没有从 MyOp 分配给 Someoperation。您需要 Someoperation 指针的映射才能使该技术起作用。这需要动态分配,以及各种对象生命周期问题。
    • 尝试编译。您不能拥有抽象类型的映射,因为构造一个映射是错误的。
    • 哦,还有一件事。将 MyOp 关联到 Someoperation(对象,而不是指针)不会覆盖虚函数表指针。即使 Doit 不是抽象的,也会调用基类的实现。
    • 我不是专家,但我认为地图希望对象具有特定的字节大小,因此如果你给它类的孩子的实例会“不安”,因为它们可能是任何尺寸。不?肯定喜欢那个头像。这种技术看起来就像你会用理智的 OOP 语言做的事情。 :D
    【解决方案3】:

    &amp;funcMap[commandType]

    只需删除&amp;。您的编译错误在这里很有用。它的右侧有一个void**,这是因为您获取了函数指针的地址。您不希望那里有两个间接级别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2011-06-01
      • 2016-08-08
      • 2019-02-14
      相关资源
      最近更新 更多