2011-01-29 7 views
4

私はこれを奇妙な方法で求めているかもしれませんが、他にどのように尋ねるべきかわかりません。C++静的関数の使用のためにクラスを初期化しないクラスのリスト

私はオブジェクトではなくクラスのリストを持っていたいと思います。 このようにして、オブジェクトを作成せずに静的関数を呼び出すことができます。

+0

少し詳しく説明できますか?これらのクラスで何をする予定ですか?どのような静的関数を呼び出そうとしていますか?これはコンパイル時か実行時ですか? – templatetypedef

+0

私は、クラスのリストをファクトリクラスのリストに登録したいと考えています。これらのクラスを繰り返し、必要なもの(静的メソッドを使用して)を探し、それをインスタンス化して返します。 – Jeremiah

答えて

4

お読みください伝統的なC関数(ちょうどもっと多くのスコープにアクセスする必要があります)に変換します。

+1

私はこのルートを選択したので、私はboostを使う必要はなく、関数ポインタの実装を練習することができました。ありがとう – Jeremiah

0

http://www.boost.org/doc/libs/1_45_0/libs/mpl/doc/refmanual/refmanual_toc.html

例:あなたは、私が可能です何を求めているとは思わない

+0

あなたのリンクはあまり役に立ちません。それがどうしたらいいのか説明してください。 –

+0

また、私は '' mpl :: vector;や 'using namespace mpl;' ''を使用することをお勧めしません。 'std :: vector'との混乱の可能性は大きすぎます。 –

1

あなたの考え方。変数、配列、コンテナクラス、または型名の他の記憶域を持つことはできません。だからあなたは何かをすることはできません

ListOfClasses[n]::someStaticMember(...); 

C++で。それは不可能です。

0

メソッドポインタのリストを少なくともないで作成することができソリューションとして

typedef vector<C1,C2,C3> types; 
at_c<types,0>::type::method(); 
... 
2

あなたが探しているものはboost typelistsです。あなたがまだ非常にで経験していない場合、私はブーストMPLに潜入することをお勧めしませんし、その複雑さのいくつが知っているか知っています。シンプルな自家製の実装のための今

:そこから

struct Null {}; 

template <typename Type, typename Next> 
struct List 
{ 
    typedef Type Type; 
    typedef Next Next; 
}; 

//Now you can make lists like so: 
typedef List<int, List<float List<short, Null> > > MyList; 

は、あなたがしたいの静的メソッドを呼び出すために再帰的なテンプレート化の実装を使用しています。静的関数は、多かれ少なかれ同等であることを

struct A 
{ 
    void SomeFunc(int); 
}; 

struct B 
{ 
    void AnotherFunc(int); 
}; 


typedef void (*Function)(int); 

std::vector<Function> vec; 

vec.push_back(A::SomeFunc); vec.push_back(B::AnotherFunc); 

for (Function f: vec) 
{ 
    f(2); 
} 

注:あなたが技術のこれらの種類に関する詳細情報が必要な場合

、私は本当にこの時点で関数ポインタを好むだろうModern C++ Design

+0

これらの問題に対するより洗練されたソリューションが本当に必要です。 –

+0

@AlexanderRafferty:0xにはバリデーショナルテンプレートがあります。 –

関連する問題