如果我尝试定义指向重载函数的指针
void myprint(int );
void myprint(const char* );
void (*funpointer)(int) = myprint;
编译器理解funpointer
应指向与其参数匹配的myprint
版本。相反,我也希望funpointer
过载
我试过简单地添加几行像
void myprint(int );
void myprint(const char* );
void (*funpointer)(int);
void (*funpointer)(const char *);
void funpointer = myprint;
然后编译器抱怨funpointer
的声明冲突(显然)。
有没有办法实现我正在寻找的东西?我希望指针表现为重载函数。我可以将其称为funpointer(1)
或funpointer("Hey.")
,它可以作为myprint
的相应版本。
答案 0 :(得分:2)
没有办法。您不能在同一范围内使用相同名称的两个变量。
答案 1 :(得分:2)
你为什么要这样做?函数指针用于基于应用程序状态的运行时多态性。如果唯一的方差是参数类型,那么普通的旧重载就可以正常工作。
如果您希望能够在客户端代码中编写将调用稍后定义的重载的库,请执行以下操作:
void foo(int x) { printf("int\n");}
void foo(const char* c){ printf("char*\n"); }
template <class T> void callfoo(T t) { foo(t); }
int main(int argc, char* argv[])
{
int x = 3;
callfoo(x);
const char* p = "Hello world";
callfoo(p);
return 0;
}
这允许lib在链接时间之前调用它实际上不知道的类型的重载。
答案 2 :(得分:1)
指针是一个Type,它不能重载。只有功能可以重载。
无法在C ++中实现指针的重载。
答案 3 :(得分:1)
您无法使用函数指针...参数列表是类型的一部分,因此任何给定的函数指针一次只能对应一个特定的重载。但是,您可能可以使用函数对象伪装它,具体取决于您需要执行的操作。
struct MyPrint {
void operator()(int i) { int_f(i); }
void operator()(const char* c_str) { str_f(c_str); }
std::function<void(int)> int_f;
std::function<void(const char*) str_f;
};
void print_int(int i) { cout << i << endl; }
void print_string(const char* str) { cout << str << endl; }
int main() {
MyPrint p;
p.int_f = print_int;
p.str_f = print_string;
p(5);
p("Hi");
}
你失去了只是名字过载的能力;您无法添加带有函数名称的set_functions(f)
并提取该函数的两个版本。但正如我所展示的那样,现在你不仅限于具有相同名称的功能,甚至仅限于功能。该对象也比以前更大,并且可能涉及一些堆分配。
答案 4 :(得分:0)
这可能被视为“笨重”,但您可以执行以下操作:
template<typename T>
struct funcptr_struct
{
typedef T type;
static type ptr;
};
template<> funcptr_struct<void(*)(int)>::type funcptr_struct<void(*)(int)>::ptr = myprint;
template<> funcptr_struct<void(*)(const char*)>::type funcptr_struct<void(*)(const char*)>::ptr = myprint;
然后,您可以使用如下语法调用myprint
函数的每个版本:
funcptr_struct<void(*)(int)>::ptr(5);