Bjarne Stroustrup による C++ プログラミング言語を読んでいます。テンプレートセクションのステートメントに出くわしました。
テンプレート引数は、定数式 (§C.5)、外部リンケージを持つオブジェクトまたは関数のアドレス (§9.2)、またはメンバーへのオーバーロードされていないポインター (§15.5) にすることができます。
オーバーロードされていないメンバーへのポインターとは何ですか? 誰かが例を挙げることができますか?
Bjarne Stroustrup による C++ プログラミング言語を読んでいます。テンプレートセクションのステートメントに出くわしました。
テンプレート引数は、定数式 (§C.5)、外部リンケージを持つオブジェクトまたは関数のアドレス (§9.2)、またはメンバーへのオーバーロードされていないポインター (§15.5) にすることができます。
オーバーロードされていないメンバーへのポインターとは何ですか? 誰かが例を挙げることができますか?
オーバーロードされていないメンバーへのポインターは、名前が示すとおり、スーパークラスをオーバーロードしていないメンバーへのポインターです。これは、うまくいくものとうまくいかないものをまとめた例です。
#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 では、クラスのインスタンスが作成され、渡されたメンバー ポインターがクラスのインスタンス化されたバージョンで逆参照され、その結果、基になる関数が呼び出されます。
テンプレートはこのアプローチを幾分柔軟にしますが、実際の状況でこのようなコードを使用する理由をまだ見つけていません..