Select 具有 std::function 参数的重载非模板函数

Select an overloaded non-template function with std::function parameter

我重载了模板和非模板成员函数,如下面的代码:

struct TypeI {};
using FuncI = std::function<void(TypeI&)>;

struct TypeA {
    
    FuncI m_fn;
    
    TypeA(FuncI const& p_fn = nullptr){
        m_fn = p_fn;
    }
    
};

struct TypeX {
    
    void add_A(int p, FuncI const& p_func) {
        if (!p_func) return;
        //...some code
        add_A(p, TypeA{ p_func });
        //...some code
    }
    
    template<class T>
    void add_A(int p, T&& p_A) {
        this->getGroup(p).add(std::forward<T>(p_A));
        //...some code
    }   
}

int main(){
    
    TypeX x;
    x.add_A(100, [](TypeI& p_I){   //issue: this chooses the template add_A().
        //...some code
    });
    x.add_A(100, [](auto& p_I){    //issue: this chooses the template add_A().
        //...some code
    });
}

我需要选择非模板add_A(),但选择了模板版本。 如何解决这个问题?

非模板版本以 std::function 作为参数,并且您传递的是 lambda,这需要用户定义的转换。模板版本完全匹配并在重载解析中获胜。

您可以对模板参数施加限制,使其在传递的对象可以转换为 FuncI 时无法使用。

template<class T>
std::enable_if_t<!std::is_convertible_v<T, FuncI>> add_A(int p, T&& p_A) {

LIVE