2012-01-06 8 views
1

この例題を考えてみてください。 第2引数がメンバ関数へのポインタである関数で暗黙の変換を強制するにはどうすればいいですか? 関数の引数リストに明示的にキャストするのは、私が今ライトを獲得したかったものではありません。 代わりに、私は何とかそれを取得としてポリモーフィズムで暗黙の変換を強制するには?

struct Base 
{ 
    virtual ~Base() = 0 {} 
}; 

struct Derived : public Base 
{ 
    void f(){} 
}; 

typedef void(Base::*polymorph)(); 

// how do I force IMPLICIT conversion here: EDIT: (polymorph type work only for polymorph pointer type no conversion) 
void func(Base* arg1, polymorph arg2) // void* arg2, (void*) arg2 etc... dosn't work 
{ 
    polymorph temp = reinterpret_cast<polymorph>(arg2); // to achive this 
} 

int main() 
{ 
    Derived* test = new Derived; 
    // first parameter work but another gives an error 
    func(test, &Derived::f); // BY NOT CHANGING THIS! 
    delete test; 
    return 0; 
} 
+1

私はそれができないと思う。 funcでは、Baseオブジェクトを扱っていることを(静的に)知っています。すべてのBaseオブジェクトにそのメソッドがあるとふりをするのは危険です。 - また、ポインタが関係しているからといって、 'new/delete'を使う必要はありません:' Derived test; func(&test、&Derived :: f); ' – visitor

+0

問題は十分に明確ではありません。説明してください。 –

+0

私は、メンバメソッドへのポインタを、メンバ引数へのポインタを取る関数引数に入力することができるようにしたいと考えています。私の例では関数は "polimorph"型を取るべきですが、それはありません。 – codekiddy

答えて

2

としてきれい...のように、それは最初のパラメータでないことをやるというコンパイラをしたいと思います。以下のコード。しかし、 "temp"が実際に呼び出されたときに "this"ポインタが参照されることになるかどうかはわかりません。

typedef void(Base::*polymorph)(); 

void func(Base* arg1, polymorph arg2) 
{ 
    polymorph temp = arg2; 
} 


int main() 
{ 
    Derived* test = new Derived; 
    // first parameter work but another gives an error 
    func(test, static_cast<polymorph>(&Derived::f)); 
    delete test; 
    return 0; 
} 
+0

努力してくれてありがとうselbieですが、2番目のパラメータはstatic_castを使って明示的に変換されていますが、意図したとおりに暗黙的に変換されていません。私は、キャスト演算子を使用せずに関数メインでそれをやりたかったのです。代わりに鋳造オペレーターを別の場所で使用する必要があります。しかしそれは可能ではありませんか? – codekiddy

+0

@codekiddy - これは、基本クラスへのポインタを派生クラスへのポインタに暗黙的にキャストできないのと同じ理由からです。それ以外に、 "temp"を使ってDerived :: fを呼び出すのはどうでしょうか?どのオブジェクトがtempを呼び出すのか、そのタイプは何ですか?答えが「ベースのインスタンス」である場合、型の安全性を保証する大きな飛躍です。私はこれを聞かせてみましょう: "あなたは本当にとにかく何をしようとしていますか?"私のチームの誰かがメンバー関数へのポインタを使って何かをしようとしていたら、インターフェースと仮想メソッドを含むより良いデザインをホワイトボードに置いているでしょう。 – selbie

+0

私が試していたことは、これ以上私をあきらめることはありません。御時間ありがとうございます! – codekiddy

関連する問題