2011-08-16 10 views
0

私の目標はMyFunctionの内部パラメータとして渡されたクラスにアクセスすることです。C++:タイプで何かにアクセスするには、渡された文字列パラメータを使用して

は、ここで私がやろうとしているものです:私はタイプで何かにいくつかの関数を呼び出すためにしようとしている

void myFunction(string myString) 
{ 
    callFunctionOn(OuterType::InnerType::myString); 
} 

。たとえば、他のファイルのコードは次のようになります。

namespace OuterType { 
namespace InnerType { 
//stuff here 
} 
} 

ただし、このようにmyStringを使用すると機能しません。 myStringは「クラス1」の値を保持している場合は、私が欲しいcallFunctionOn部分が

callFunctionOn(OuterType::InnerType::class1); 

として解釈されるようにすることを、私はこのように感じるの超シンプルですが、私は一日中プログラミングされてきたし、私の心は疲れて成長し...

は解決:この方法では、このために、私は反射で言語を必要とするだろうように見えます。これを解決するために、私は問題に別のアプローチをとり、代わりにクラスへのポインタを渡しました。

+2

あなたはたぶん別の言語で働くほうがずっと幸せです。 –

+0

*なぜ*あなたはこれをしたいですか? [あなたの目標は何ですか?](http://www.catb.org/esr/faqs/smart-questions.html#goal) – GManNickG

答えて

6

C++は、反射が組み込まれていないが、それは、データ、機能、およびクラスメンバへのポインタを持っています。だから、特定の名前(あなたは事前にマップにすべての名前/ポインタのペアを追加する必要があります)とのポインタを見つけることstd::mapまたはunordered_setを使用することができます。

もちろん
namespace Outer 
{ 
    namespace Inner 
    { 
     void funcA(void) { std::cout << "called funcA" << std::endl; } 

     std::map< std::string, void (*)(void) > members; 
    } 
} 

// in some initialization function 
Outer::Inner::members["funcA"] = &Outer::Inner::funcA; 


// later 
std::string myString = "funcA"; 
void (*f)(void) = Outer::Inner::members[myString]; // lookup function by name 
(*f)(); // call function via its pointer 

ポインタの型は、おそらくあなたのアプリケーションの要件を満たすように変更する必要があります。

あなたの解決策は次のようになりそうです。

+1

+1良い解決方法がありますが、Caseyがやるべきこと。 –

+0

@モーニング:それはあなたが意味するものですか? –

+0

ええ、それははるかに良いです。 –

0

はあなたが意味するか:

OuterType::InnerType::callFunctionOn(myString); 
3

あなたは、その名前が含まれている実行時の文字列に基づいて変数にアクセスしようとしていますか?それは可能ではありません;変数の名前はコンパイルとリンクの後に消えます。 (デバッグを容易にするために保持されている場合を除いて)。

0

多分、この考え方:operator()はパラメータを取ることができ、クラス内でそれをラップすると、そのパラメータに基づいてオーバーロードされた演算子()で解決された呼び出しを行うことができます。

template<typename TypeSig, class InstanceOf, typename NA,typename Args> 
class FuncMap { 
    public: 
     typedef TypeSig (InstanceOf:: *cbMethod) (NA, Args); 

     FuncMap(InstanceOf & cInst, cbMethod cbM) : mcInst(cInst) {mcbM = cbM;} 

     TypeSig operator() (NA na, Args args) {return (mcInst.*mcbM)(na, args);} 
    private: 
     InstanceOf & mcInst; 
     cbMethod mcbM; 
}; 

実行時の文字列値のマップをキーとして作成し、上記のインスタンスメソッドへのポインタを作成する必要があります。私はこれを再ディスパッチ・トレースとRTTIオーバーヘッドよりも少ないカスタム・ランタイム・ディスパッチに使用しました。あなたが望むよう

これには鍵が見つからない場合は、デフォルトを持つことができ、または他のロジック。

関連する問題