2016-04-08 4 views
1

私はOOPの初心者で、自分のコードでは苦労します。問題は、関数内でキャストを行い、(パラメータとして渡された)特定のクラスからメソッドを呼び出すことができるように、パラメータとして未知のクラスを送信したいだけだということです。私はテンプレートを使用する必要がないようにいくつかのトリックがあるかどうかを知りたいのですが、私はそれらをよく知りません。私のプログラムには、同じ名前のメソッドを持つより多くのクラスが含まれているので、この時点では問題はありません。私は自分自身を明確にしていない場合、以下のコメントを残してください、私は説明するために全力を尽くすでしょう。ありがとう!パラメータとして未知のクラスを渡す

void myClass::myFunc(_myInstance, _myMethod,void* object) 
{ 
    ((_myInstace*)object)->_myMethod(); 
} 
+0

さて、あなたはこの方法を考え始めましたから、それはテンプレートを学ぶのにちょっとした時間かもしれない。彼らは不思議に思う。 – DeiDei

+0

"sizeof"やそのようなものを使用すると、いくつかの小さなトリックを行う方法はありますか? – braga

答えて

1

テンプレートなしでは不可能です。おそらく、同様の効果を得るためにいくつかのマクロを使うことができますが、おそらく型の安全性を与えないので、私は非常に落胆します。

template<typename Type> 
void func(void (Type::*method_name)(), void* object) { 
    (static_cast<Type*>(object)->*method_name)(); 
} 

し、このようにそれを使用します:

あなたはこのようなものを使用する必要があります

struct A { void fn() { std::cout << "Ok!"; } }; 

int main() { 
    A a; 
    void* ptr = &a; 
    func(&A::fn, ptr); 
} 

Live demo

+0

"void func"のテンプレートを使用するには、myClass定義の前に "template "と入力する必要がありますか? – braga

+0

@braga 'template 'は関数 'fn'のテンプレートパラメータを宣言しました。この関数は、(この例のように)テンプレートパラメータ自体の有無にかかわらず、どのクラスでも使用できます。この例で示すように、テンプレートパラメータを持たないクラス 'A'ではうまく動作します。 – Shoe

+0

ご協力いただきありがとうございます!私はこれが私が探していた答えだと思います。良い一日を! – braga

関連する問題