什么是非重载指向成员的指针和重载指向成员的指针?

时间:2013-01-24 06:09:37

标签: c++

我正在阅读Bjarne Stroustrup的C ++编程语言。我在模板部分看到了声明。

模板参数可以是常量表达式(§C.5),即对象或函数的地址 使用外部链接(第9.2节),或指向成员的非重载指针(第15.5节)。

什么是非重载指向成员的指针?有人能举例吗?

1 个答案:

答案 0 :(得分:0)

非重载指向成员的指针就像名称一样 - 指向未超载超类的成员的指针。这是一个我刚刚汇总了将要发挥作用的例子:

#include <iostream>

class Foo {
public:
    virtual void printN() { std::cout << 42; }
};

class Bar : public Foo {
public:
    void printN() { std::cout << 31; }
};

template <typename T, typename C>
class SomeTemplate {
public:
    void PrintData(T d) { C c; (c.*d)(); }
};

int main() {
    SomeTemplate<void (Foo::*) (), Foo> t; // Compiles - '42'
    t.PrintData(&Foo::printN);

    SomeTemplate<void (Bar::*) (), Bar> t; // Compiles - '31'
    t.PrintData(&Bar::printN);

    SomeTemplate<void (Foo::*) (), Bar> t; // Won't compile, can't convert overloaded pointers
    t.PrintData(&Foo::printN);
    return 0;
}

在PrintData中,创建了一个类的实例,并且在类的实例化版本上取消引用传递的成员指针,从而导致调用它的底层函数。

模板使这种方法更加灵活,但是我还没有找到在真实情况下使用这样的代码的理由 - 如果有人能找到一个我喜欢开悟的那个......