我有关于std::function
的示例:
int add(int x, int y, int z) {return x + y + z;}
int add(int a, int b) {return a + b;}
int main()
{
std::function<int(int, int)> fn = add; // error
int(*pfn)(int, int) = add; // OK
fn = pfn; // ok fn is bound to add(int, int)
std::cout << fn(5, 7) << std::endl; // 12
}
为什么初始化add
时过载解析不能解析哪个版本的fn
,但是能够初始化功能指针pfn
?
是否有替代方法,而不是使用函数指针来确定重载函数的哪个版本作为std::function
对象的初始化程序?
为什么初始化fn时过载解析不能解析哪个版本的add,但是能够初始化函数指针pfn?
因为基于函数指针的类型,overload resolution是在函数指针的初始化(如pfn
)中执行的。
在所有这些上下文中,从重载集中选择的函数是其类型与目标期望的指向函数的指针,指向函数的引用或指向成员函数类型的指针匹配的函数:正在初始化的对象或引用,左侧-赋值,函数或运算符的手侧,函数的返回类型,强制类型转换的目标类型或模板参数的类型。
作为解决方法,您可以应用static_cast
来明确指定要重载。例如
std::function<int(int, int)> fn = static_cast<int(*)(int, int>(add);