首页 > 解决方案 > 为什么重载函数的函数指针需要static_cast?

问题描述

对于下面的代码,我得到了错误

#include <iostream>
#include <functional>

using namespace std;

class A {};
class B {};

namespace N
{
    void func(A a, int z){}
    void func(B a, int z){}
}

void func_1(std::function<void(A, int)> x)
{
    A a;
    x(a, 1);
}

int main()
{
    func_1(N::func);
    
    return 0;
}

错误:

    main.cpp:23:19: error: cannot resolve overloaded function 'func' based on conversion to type 'std::function<void(A, int)>'
   23 |     func_1(N::func);

如果我们为func_1(N::func);as做静态转换func_1(static_cast<void (&)(A, int)>(N::func));,那么这工作正常。但我希望这可以在没有演员表的情况下工作。

标签: c++function-pointers

解决方案


std::function<void(A, int)>比 更复杂void(*)(A, int)

template< class F >
function( F f );

用 初始化目标std::move(f)。iff是指向函数的空指针或指向成员的空指针,*this调用后将为空。此构造函数不参与重载决议,除非对于参数类型和返回类型fCallableArgs...R

N::func在您确定您的意思之前,您甚至不知道哪些构造函数参与了重载决议。

可以设想一种组合的重载解决方案和模板参数推导方案,该方案可以通过尝试std::function<void(A, int)>::function<void(*)(A, int)>(任意多个)构造函数的其他有效实例来“在中间相遇”。

问题比比皆是。

  1. 它必须可证明地得出一个答案。一般来说,模板有无限可能的实例化。int(*)(A, int)如果您通过了它,您还希望它能够选择int g(A, int)
  2. 它确实应该与当前的方案一致,从而得出明确的答案。
  3. 每个编译器供应商都必须正确实现它。

推荐阅读