重载指向重载函数的指针

时间:2011-10-07 20:01:37

标签: c++ function pointers function-pointers overloading

如果我尝试定义指向重载函数的指针

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的相应版本。

5 个答案:

答案 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);