【发布时间】: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