【问题标题】:Initializing a std::function object from an overloaded function [closed]从重载函数初始化 std::function 对象[关闭]
【发布时间】:2021-10-16 22:47:23
【问题描述】:

我有一个 map 类型的函数表,它将每个二元运算符映射到一个函数,但我有一个重载函数 Add,它需要两个 int,另一个版本需要两个 std::string。当我传递函数名 (int Add(int, int)) 时,我得到编译器抱怨歧义。所以我找到了一种解决方法,使用显式初始化到版本 (int(int, int)) 的指针然后传递它。

int main(){

    int Add(int, int);
    std::string Add(std::string const&, std::string const&);

    std::map<std::string, std::function<int(int, int)>> binOps;
    //binOps["+"] = Add; // error: amiguous
    int(*pFnAdd)(int, int) = Add;
    binOps["+"] = pFnAdd; // Ok

    binOps["+"] = static_cast<int(*)(int, int)> (Add); // OK?
    std::cout << binOps["+"](10, 20) << '\n'; // ok 30. I should use binOps.find rather than []

}
  • 代码可以很好地消除Add 的用法的歧义,所以我的第二个版本将临时指针传递给int Add(int, int) 是可以的,或者我应该传递一个命名指针来像pFnAdd 这样的函数?

【问题讨论】:

  • 在这两种情况下,您获得相同的地址。因此,任何答案都将主要是关于人们觉得阅读更愉快的内容(这是基于意见的)。
  • 显式类型转换非常好。

标签: c++ overloading function-pointers


【解决方案1】:

这个问题是基于意见的......但是,我的意思是,从某种意义上说,明确的演员表显然更好,因为我认为没有理由这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多