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) {
我重载了模板和非模板成员函数,如下面的代码:
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) {