3

Bjarne Stroustrup による C++ プログラミング言語を読んでいます。テンプレートセクションのステートメントに出くわしました。

テンプレート引数は、定数式 (§C.5)、外部リンケージを持つオブジェクトまたは関数のアドレス (§9.2)、またはメンバーへのオーバーロードされていないポインター (§15.5) にすることができます。

オーバーロードされていないメンバーへのポインターとは何ですか? 誰かが例を挙げることができますか?

4

1 に答える 1

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 では、クラスのインスタンスが作成され、渡されたメンバー ポインターがクラスのインスタンス化されたバージョンで逆参照され、その結果、基になる関数が呼び出されます。

テンプレートはこのアプローチを幾分柔軟にしますが、実際の状況でこのようなコードを使用する理由をまだ見つけていません..

于 2013-01-24T07:15:47.933 に答える