将重载函数分配给函数指针作为默认值
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
。我看到你只提供了两个bar
(bool 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
如果您愿意,您也可以将 std::function
的用法替换为指向函数的指针:
void foo(int (*fn_ptr)(int) = +[](int p) -> int{ return bar(static_cast<double>(p)); }) {
fn_ptr(2);
}
答案很简单。我已经声明了函数
Error_C MErr (exception ex);
在 class 声明后 exception
所以 class exception
的虚拟成员函数不能使用函数的这个特定重载 MErr
我没有办法实现这个默认参数。
一个函数
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
。我看到你只提供了两个bar
(bool 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
如果您愿意,您也可以将 std::function
的用法替换为指向函数的指针:
void foo(int (*fn_ptr)(int) = +[](int p) -> int{ return bar(static_cast<double>(p)); }) {
fn_ptr(2);
}
答案很简单。我已经声明了函数
Error_C MErr (exception ex);
在 class 声明后 exception
所以 class exception
的虚拟成员函数不能使用函数的这个特定重载 MErr
我没有办法实现这个默认参数。