C++ 扩展std::function以消除重载函数的歧义

C++ 扩展std::function以消除重载函数的歧义,c++,c++14,overloading,std-function,C++,C++14,Overloading,Std Function,当前的std::function无法消除重载函数的歧义(请参见最后的示例)。因此,当从重载函数构造或分配时,用户必须手动消除歧义(例如使用显式转换),这很烦人。由于std::function具有函数签名信息,因此它实际上可以自动消除歧义。因此,我尝试用std::function创建这样一个新的函数,最终得到以下代码。扩展标准库可能很棘手而且容易出错。所以,我想知道我是否遗漏了什么,或者存在更好的解决方案。具体地说,我可以对新的函数部分专门化std::使用_分配器?(可以找到代码的原始版本) 模板

当前的
std::function
无法消除重载函数的歧义(请参见最后的示例)。因此,当从重载函数构造或分配时,用户必须手动消除歧义(例如使用显式转换),这很烦人。由于
std::function
具有函数签名信息,因此它实际上可以自动消除歧义。因此,我尝试用
std::function
创建这样一个新的
函数
,最终得到以下代码。扩展标准库可能很棘手而且容易出错。所以,我想知道我是否遗漏了什么,或者存在更好的解决方案。具体地说,我可以对新的
函数
部分专门化
std::使用_分配器
?(可以找到代码的原始版本)

模板
类函数:public std::function{
私人:
模板
使用enable\u if\u fn\u t=std::enable\u if\u t<
std::是一样的吗
::值>;
公众:
使用base=std::function;
函数(R(*ptr)(Args…):基{ptr}{
函数()=默认值;
函数(std::nullptr_t):基{nullptr}{
模板
函数(F):基{std::move(F)}{
模板
函数(std::分配器参数标记、常量Alloc和Alloc)
:base{tag,alloc}{}
模板
函数(std::allocator_arg_t标记,常量Alloc&Alloc,std::nullptr_t)
:base{tag,alloc,nullptr}{
模板
函数(std::allocator_arg_t标记,常量Alloc&Alloc,F)
:base{tag,alloc,std::move(f)}{
模板
函数(std::分配器参数标记、常量Alloc和Alloc、常量函数和其他)
:base{tag,alloc,static_cast(其他)}{
模板
函数(std::分配器参数标记、常量Alloc和Alloc、函数和其他)
:base{tag,alloc,std::move(static_cast(other))}{
函数和运算符=(R(*ptr)(参数…){
base::operator=(ptr);
归还*这个;
}
函数和运算符=(std::nullptr\t){
base::operator=(nullptr);
归还*这个;
}
模板
函数和运算符=(F&&F){
base::operator=(std::forward(f));
归还*这个;
}
模板
函数和运算符=(std::reference\u包装器f){
base::operator=(f);
归还*这个;
}
};
名称空间标准{
模板
结构使用\分配程序:true \类型{};
}
例如:

void func(int) {}
void func(char) {}

int main() {
  // std::function<void(int)> f = func; // construction not OK
  // f = func; // assignment not OK
  function<void(int)> f = func; // construction OK
  f = func; // assignment OK
}
void func(int){}
void func(char){}
int main(){
//std::function f=func;//构造不正常
//f=func;//分配不正常
函数f=func;//构造正常
f=func;//分配正常
}

请尝试。上述代码中是否已包含“消除歧义”部分?@m.s.是。请注意
R(*ptr)(Args…
参数。能否添加一个如何使用此参数的示例?
void f(函数);void f(std::string);f(“就超负荷解决而言”)关于“过载解决方案”的哪一部分很难理解?
void func(int) {}
void func(char) {}

int main() {
  // std::function<void(int)> f = func; // construction not OK
  // f = func; // assignment not OK
  function<void(int)> f = func; // construction OK
  f = func; // assignment OK
}