我正在阅读Bjarne Stroustrup的C++编程语言。我在模板部分遇到了该声明。
模板参数可以是常量表达式(第C.5节),即对象或函数的地址
带有外部链接(第9.2节)或指向成员的无重载指针(第15.5节)。
什么是成员的非重载指针?有人可以举例吗?
最佳答案
顾名思义,未重载的成员指针是指向未重载父类(super class)的成员的指针。这是一个示例,我只是汇总了将起作用和不起作用的地方:
#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中,将创建该类的实例,并在该类的实例化版本上取消引用传递的成员指针,从而调用其基础函数。
模板使这种方法更灵活一些,但是我还没有找到在真实情况下使用这样的代码的理由-如果有人可以找到我希望启发的代码。