childs = childs.reduce((acc, val) => acc.concat(val), [])
答案 0 :(得分:3)
没有干净的方法可以做到这一点,只有丑陋的方法。如:
static_cast<int (*)()>(&foo)();
或者:
int (*p)() = &foo;
(*p)();
最重要的是,由于模棱两可,您不能依赖重载解析。因此,您需要使用这种方法来明确地解析符号。
首选解决方案是首先避免模棱两可的重载。通常可以找到一些合理的方法来做到这一点,但这取决于实际的细节。
答案 1 :(得分:1)
您可以显式强制转换函数指针,但不确定是否应该这样做。
#include <iostream>
using namespace::std;
int foo(); //function with no argument
int foo(int=10); //Default argument
int foo()
{
cout<<"\n Foo , I am foo \n";
return 0;
}
int foo(int f)
{
cout<<"\n I am Foo too.\n";
return 0;
}
int main()
{
static_cast<int(*)()>(foo)();
foo(2);
cin.get();
return 0;
}
编辑:
此行static_cast<int(*)()>(foo)();
只是转换和调用函数的缩写形式。
为了说明这一点,我们可以分三步将其拆开:
将myFuncType定义为指向返回int并且不带参数的函数的指针
using myFuncType = int(*)();
通过将重载的名称foo强制转换为不带参数的函数类型,并将其存储在名为f的变量中来解决该问题
auto f = static_cast<myFuncType>(foo);
// or auto f = (myFuncType)foo;
// or auto f = (myFuncType)&foo; C++ actually does the address-of implicitly with functions
最后一个是调用函数指针
f(); //or (*f)(); C++ automatically dereferences function pointer on call, but you can also manually dereference
答案 2 :(得分:0)
不清楚两个函数声明为何使用相同的名称。仅当他们应该“做同样的事情”时,才应该这样做。
如果两个函数应该做相同的事情,则:
为函数指定默认参数时,会抛出一个额外的函数签名。因此,
int foo(int arg=10);
还给你
int foo();
它表示,对foo()
进行 *任何调用“ ”时,arg的值为10
。
但是随后您又抛出了一个额外的int foo();
并返回了0
,这使编译器感到困惑。在更抽象的层次上,您实际上对您自己感到困惑,即默认参数是函数应该执行的“操作”。
如果两个函数不执行相同的操作,则它们不应具有相同的名称。有几种不同的方法可以做到这一点: