将重载函数分配给函数指针作为默认值

assigning overloaded function to function pointer as default value

一个函数

foo( int (*fnptr)(int) );

我想为函数指针设置一个默认值int bar(int)

即指针的默认值为bar

bar 也被重载为

double bar (double);
bool bar (bool);

如何赋值??

我试过了

foo ( int (*fnptr)(int) = bar);

但是没用。

编辑 我正在使用 MS visual studio 并收到错误代码 C2440

'default argument': 无法从 'overloaded-function' 转换为 'Error_C (__cdecl *)(HMstd::exception)'

我的实际函数是 class 的成员函数 我定义了 exception 命名空间 HMstd

virtual Error_C execute_protocol(Error_C(*execute)(exception ex) = HMstd::MErr);

函数是

Error_C MErr(Error_C code);
Error_C MErr(char* desc);
Error_C MErr(exception ex);

其中 Error_C 是另一个 class

这是三个重载函数的定义HMstd::MErr

Error_C HMstd::MErr(Error_C code)
{
    std::cout << "\n\nError: An Error Of Code " << int(code) << "     Occured....\n\n";
    return SUCCESS;
}

 Error_C HMstd::MErr(char* desc)
{
    if (desc == NULLPTR)
        return E_NULLPTR;
    std::cout << desc;
    return SUCCESS;
}

Error_C HMstd::MErr(exception ex)
{
    bool Nullar = TRUE;
    bool uninit;
    for (int i = 0;i < 200;i++)
        if (ex.description[i] != '[=15=]')
            Nullar = FALSE;
    uninit = (int(ex.code) == -201) && Nullar;
    if (uninit)
    {
        return UNINIT_PARAMETER;
    }
    MErr(ex.code);
    MErr(ex.description);
    return SUCCESS;
} 

快速回答:

使用类型转换

短代码:

// ...
int bar (int) {
  cout << "Right\n";
  // bar(true); // just in case you want to invoke bool bar(bool)
  // bar(0.0f);
  return 0;
}
// ...
int foo (int (*ptr) (int) = static_cast<int (*) (int)>(bar)) {
  return ptr(0);
}
// ...

完整代码:

#include <iostream>

using namespace std;

int bar (int) {
  cout << "Right\n";
  // bar(true); // just in case you want to invoke bool bar(bool)
  // bar(0.0f);
  return 0;
}

bool bar (bool) {
  return false;
}

double bar (double) {
  return 0;
}

int foo (int (*ptr) (int) = static_cast<int (*) (int)>(bar)) {
  return ptr(0);
}

int main () {
  return foo();
}

解释:

你有多个 bar 所以我不能把 = bar 作为默认参数。因此,您必须指定哪个 bar。我使用了类型转换,因此编译器可以指定其中之一 bar。我看到你只提供了两个barbool bar(bool)double bar(double),但你不能将这些函数中的任何一个转换为int bar(int)(如果gcc允许,程序可能无法正常运行,特别是 double bar(double)),所以你需要在新的 int bar(int)

中调用这两个之一

注意:

您也可以使用 unsafe C 风格类型转换 (int (*)(int)) bar 而不是 static_cast<int (*) (int)>(bar) 但这是 C++

如果您使用的是 Turbo C++,上面的代码可能无法运行,因此您可能更喜欢 C 风格的类型转换,或者只是切换到 GCC。

另请参见:

How do I specify a pointer to an overloaded function?

也许您正在寻找这样的东西:

#include <iostream>
#include <functional>

double bar (double) {
    std::cout << "double bar (double) called" << std::endl;
    return 0.0;
}
bool bar (bool) {
    std::cout << "bool bar (bool) called" << std::endl;
    return false;
}

void foo(std::function<int(int)> fn = [](int p) -> int{ return bar(static_cast<double>(p)); }) {
    fn(2);
}

int main() {
    foo();
}

输出:

double bar (double) called

[live demo]

如果您愿意,您也可以将 std::function 的用法替换为指向函数的指针:

void foo(int (*fn_ptr)(int) = +[](int p) -> int{ return bar(static_cast<double>(p)); }) {
    fn_ptr(2);
}

[live demo]

答案很简单。我已经声明了函数

Error_C MErr (exception ex);

在 class 声明后 exception

所以 class exception 的虚拟成员函数不能使用函数的这个特定重载 MErr 我没有办法实现这个默认参数。