2016-05-04 13 views
1

私は工場「M」を作る。私はクラス "C"を構築する必要があります。私のクラス 'M'を含む開発者は、 'M :: getInst()'を呼び出し、正しく構築された 'C'のインスタンスを持っていたいと考えています。クラスがパラメータパックを公開することは可能ですか?

さらに私は、公共のコンストラクタを提供すること以外は絶対に何もしないで、私たちと一緒に働くことができるようにしたいと思います。コンストラクタ。

これは可能ですか?私が原則としてやりたいことは以下の通りです。問題は、C++でメソッド "types()"を書く方法がないことです。値として型を返すことは不可能です(1つでも!)。

ように、ユーザによって、呼び出されることになる
struct C { 
    String s; Blob b; 
    C(String a, Blob b) : s(a), b(b) {} 
    typelist types() { 
     return { String, Blob }; 
    } 
}; 

clas M { 
    template<typename T> 
    T* getInst() { 
     return getInst_imp<T::types()>(); 
    }; 

    template<class... Ks> 
    T* getInst_imp() { 
     return T(getValue(Ks)...); 
    } 
}; 

C* instance = M::getInst<C>(); 

この理由は、「C」はコンポーネントタイプの固定されたセットからコンポーネントから構築されることです。私のクラス 'M'はそれらを初期化する方法の権威です。したがって、開発者がCの新しいフレーバーを作りたいと思うたびに、なぜ既存のすべてのホイールを再発明するのが理にかなっていますか?彼らは、必要なコンポーネントを 'M'に伝えるだけです。しかし、それを行う方法?あなたが今できる

答えて

1

Eric Niebler suggests typelistには、次のように定義する必要があります

struct C { 
    String s; 
    Blob b; 
    C(String a, Blob b) : s(a), b(b) {} 
    using types = typelist<String, Blob>; 
}; 

その後、我々はtypelistにを使用するエリックの小型メタプログラミングライブラリからいくつかのテクニックを借りることができます工場内:

template<typename T, typename List> 
struct MImpl; 

template<typename T, typename ...Ks> 
struct MImpl<T, typelist<Ks...>> { 
    static T getInst() { 
     return T(getValue<Ks>()...); 
    } 
}; 

class M { 
public: 
    template<typename T> 
    T getInst() { 
     return MImpl<T, typename T::types>::getInst(); 
    } 
}; 

Live demo

+0

これは完璧です!私は同様のことをやろうとしていましたが、typedefを使うことは考えていませんでした。クラス自体をテンプレート化しようとしていました。 「ユーザー」は、使用前に専門化する必要があったため、それはデッドエンドだと思っていました。 しかし、typedefはCの著者にその情報を格納する場所を与えます。ありがとう! – SaburoutaMishima

1

ベストstd::tupleです:

あなたが何をすべきかに応じて、参照の tupleとして良いかもしれ、
using typelist = std::tuple<String, Blob>; 
typelist types() { 
    return typelist(s, b); 
} 

あなたのクラス Cに公開することができ
// A class template that is just a list of types: 
template <class... T> struct typelist { }; 

+0

タプルはまだ10個に制限されていますか?私たちはより大きなタプルクラスを持つlibを探すかもし​​れないし、おそらく私たち自身のタプルをローリングするかもしれません... 一般的にこれを達成する別の方法があると思いますか?私は悪いアプローチを思いついたのだろうかと思う。 – SaburoutaMishima

+0

@Saburouta Huh?タプルは項目の数に制限されていません。 – Barry

+0

@Barryなぜあなたは今* *と言うのですか?他の方法でパラメータパックをエクスポートする計画はありますか?ちょっと興味があるんだけど。ありがとうございました。 – skypjack

関連する問題